找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] 上岸算法 I LeetCode Weekly Contest 244解题报告

上岸算法 回复:0 | 查看:3182 | 发表于 2021-6-8 05:32:43 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

No.1判断矩阵经轮转后是否一致
解题思路
模拟矩阵的旋转即可。
代码展示
  1. class Solution {# v0 r# u5 X1 v/ S% g
  2.     public boolean findRotation(int[][] mat, int[][] target) {  i' S# o$ g6 u$ }: W9 S
  3.         for (int i = 0; i < 4; i++) {% T% P6 _' \, a; m+ a+ |
  4.             if (equal(mat, target)) {& l! x: K) Q5 m+ j8 ?" d
  5.                 return true;
    5 R+ r) Y3 ]7 M3 ^0 Z" q
  6.             }
    . D" l7 A1 \* \
  7.             mat = rotate(mat);7 P' ]4 _7 Y" B7 ?
  8.         }$ C% ]3 m( e: n
  9.         return false;
    , q# b: g- Y& `. b5 P7 F9 ~* Z5 R' r
  10.     }
    9 [7 L$ U" ^* d# }

  11. : \! @+ O% R+ e5 b3 e2 h
  12.     private int[][] rotate(int[][] mat) {2 N8 [. k4 N6 y- B# {
  13.         int[][] r = new int[mat.length][mat[0].length];
    1 W0 e. R8 G) i4 E( r
  14.         for (int i = 0, y = 0; i < mat.length; i++, y++) {& a* P" A- X! E' e, Q, l# u, p
  15.             for (int j = 0, x = mat.length - 1; j < mat[0].length; j++, x--) {8 O$ Y7 h6 q: t0 Q# q1 |# J
  16.                 r[i][j] = mat[x][y];
    ; o3 Q0 C! A' T4 F$ J& j% ^$ D2 w- s
  17.             }
    & ]) C0 E0 R3 p; [/ ^
  18.         }2 h+ ~8 u. ]" {
  19.         return r;0 a" _  }* n0 G  p6 B% W2 `
  20.     }
    , O, u# E; C9 ^2 f

  21. . L* W6 Y1 U# U* j( v, m# `
  22.     boolean equal(int[][] mat, int[][] target) {
    1 d2 Q0 ]' G9 w" n! D
  23.         for (int i = 0; i < mat.length; i++) {
    ) `. b# R' n' N7 w- g' B
  24.             for (int j = 0; j < mat[0].length; j++) {$ W8 n# V1 v+ v( U
  25.                 if (mat[i][j] != target[i][j]) {# w/ y- z# `4 {' Q# {
  26.                     return false;
    , P+ q; `' s  d; Q/ q
  27.                 }
    ( a$ `7 X: n- V7 I! s
  28.             }9 A$ r; q5 U3 w/ ^- a& Z0 u
  29.         }) S( g: p( q3 B) B# [; ]
  30.         return true;
    . \% x& i3 y7 z* J' _0 B7 B
  31.     }8 n' ]4 R# i* J9 K; X
  32. }
复制代码
上岸算法公开课,毫无保留地将业界面试核心知识免费传授给大家,并配有课前课后习题以及标准答案集以方便大家学习。
长达近30小时的核心课程帮助大家掌握所有面试必备知识,在一个月内有效突破算法面试认知,从而有自信面对FAANG的挑战。
  联系上岸小年糕,领取课件及视频
No.2 使数组元素相等的减少操作次数
解题思路
简单暴力地,从大到小依次处理每个元素即可。使用 TreeMap 的代码非常简洁,或者可以使用链表,速度更快。
代码展示
  1. class Solution {
    * b1 P7 ~; D( [: z
  2.     public int reductionOperations(int[] nums) {
    / }* k- m- J8 J4 v0 x
  3.         TreeMap<Integer, Integer> count = new TreeMap<>();: e9 A! Q0 z$ d8 S
  4.         for (var num : nums) {
    * o6 f/ Z) g9 c: u& _) x
  5.             count.put(num, count.getOrDefault(num, 0) + 1);  J# h( n8 k. y  A' G
  6.         }
      R; \. X; q4 @
  7.         int result = 0;
    : b6 l" U4 ]" r* \& L: D
  8.         while (count.size() > 1) {
    , B: t8 k6 v9 F, N/ d# k
  9.             var largest = count.pollLastEntry();$ ~( o: B1 |2 P  D7 J8 |0 R0 w
  10.             var nextLargest = count.lastEntry();! P, x* J5 u" ^8 Z
  11.             result += largest.getValue();
    7 j3 c" N* U' H5 F
  12.             count.put(nextLargest.getKey(), nextLargest.getValue() + largest.getValue());/ @4 N3 _3 f1 J) R
  13.         }3 R( ~' D) u. {) R" d3 }
  14.         return result;! j7 k! u7 M! f5 p
  15.     }& t0 b: |2 n0 g. J3 B# x! U+ P  y
  16. }
复制代码
No.3 使二进制字符串字符交替的最少反转次数
解题思路
枚举类型 1 操作执行的次数即可。
执行完类型 1 的操作之后,需要执行的类型 2 的操作次数是固定的。
我们只需要知道奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量就可以计算出类型 2 的操作次数。
每执行一次类型 1 的操作,奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量的变化都可以 O(1) 地计算出来。
代码展示
  1. class Solution {
    : B9 ^1 C; [: P7 Q8 [( k0 B0 r. P
  2.     public int minFlips(String s) {
    6 B# @2 |- c% U& h5 f' U* w8 [( z
  3.         char[] str = s.toCharArray();* p: F1 b9 o. w+ E* I6 t6 Y9 f9 E
  4.         // count[0] 表示偶数下标上 0 和 1 的数量
    * f% _/ g: g. R2 R5 h$ Q+ {3 b% L
  5.         // count[1] 表示奇数下标上 0 和 1 的数量# b' _4 Y( w) Z  l8 V3 b
  6.         int[][] count = new int[2][2];% @8 s7 J4 q1 D
  7.         for (int i = 0; i < str.length; i++) {
    , l8 o0 C8 {; ]; A  z; j: {
  8.             count[i % 2][str[i] - '0']++;
    0 q9 K& Q' [4 U! P$ V( h, q
  9.         }7 b* F2 L' k/ H7 O; I. }
  10.         int result = Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]);+ w* L, M, \/ g! Z8 \/ J
  11.         for (int i = 0; i < str.length - 1; i++) {! f& G! r  ?9 u( A0 i  S5 S3 q8 d
  12.             count[0][str[i] - '0']--;
    / s; k9 s1 L1 c' e
  13.             int tmp = count[1][0];
    . ~# [3 {9 P  g9 u5 c5 U
  14.             count[1][0] = count[0][0];8 V" q( p; W% f: y! ?  [, c' X
  15.             count[0][0] = tmp;) r; c/ a  H6 l% B
  16.             tmp = count[1][1];
    * _3 B9 v, N# i  r+ @, a
  17.             count[1][1] = count[0][1];
    7 ~3 m9 Q4 ?" u) e# U' v6 S& s
  18.             count[0][1] = tmp;2 R! e3 m1 _6 ~
  19.             count[(str.length - 1) % 2][str[i] - '0']++;
    + @' C, j6 t) L% x* n. e
  20.             result = Math.min(result, Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]));. `$ h" R8 W2 F1 ]! C( e+ A
  21.         }- E8 E0 a9 Z5 [! v
  22.         return result;$ K4 W6 I, J$ Q
  23.     }  O$ ^; q! H# j7 j! m
  24. }
复制代码
No.4 装包裹的最小浪费空间
解题思路
二分查找。
对所有的包裹和供应商的盒子都排序,然后依次枚举每个供应商即可。
计算一个供应商的盒子的浪费空间时,从小到大使用每种盒子,每种盒子尽可能多装包裹即可,使用前缀和数组和二分查找可以快速计算结果。
代码展示
  1. class Solution {) n6 s  Y2 T* ~% s0 W
  2.     public int minWastedSpace(int[] packages, int[][] boxes) {
    . i6 W/ t5 E2 N0 ]  f- d
  3.         Arrays.sort(packages);
    ; T1 y- O1 }- S3 P% S
  4.         long[] preSum = new long[packages.length];5 E# f& }! k( p- T
  5.         preSum[0] = packages[0];
    6 f2 Q+ o" l- p, U, r# G3 d
  6.         for (int i = 1; i < preSum.length; i++) {
    5 j0 x: O( B' z. J
  7.             preSum[i] = preSum[i - 1] + packages[i];
    : N2 W* m% L2 }( M" O3 u
  8.         }
    * W0 q" ~/ ?% v" `) P9 ^
  9.         long result = -1;, [/ `5 Y1 f( H: ~
  10.         for (int[] box : boxes) {
    ( \) ~& q% l0 Z7 O/ E, e' H% w
  11.             Arrays.sort(box);" s; C+ Z$ |! W  w
  12.             long t = waste(packages, preSum, box);" x! G. ^& ?9 ]6 v
  13.             if (t != -1 && (result == -1 || t < result)) {
    3 `8 \' `& N# C4 U6 r8 b
  14.                 result = t;5 A) A0 v( d. t: N
  15.             }: N, t; q! [5 t* f
  16.         }, d! f# s! y4 `6 a
  17.         return (int) (result % 1000000007L);- j5 ?- p6 W  V3 ]
  18.     }
    ( D# V0 G8 i- U6 k) |! b
  19. 0 G8 P* K# @2 }
  20.     private long waste(int[] packages, long[] preSum, int[] boxes) {3 Z! z7 i! W2 G5 H
  21.         int start = 0;8 z) ?  q$ X; g  k  E" j
  22.         long result = 0;
    3 D* f7 o6 C: J9 a" c8 C6 k2 I
  23.         for (int box : boxes) {* J) E9 ?# p+ }8 ?: L! s
  24.             if (box < packages[start]) {
    ( x& Q. q! U. F0 ]. f
  25.                 continue;
    * U5 f- z0 u/ }9 f0 l) F% ?: `
  26.             }
    4 o' @# X0 a/ y  e# q- X
  27.             int index = binarySearch(packages, box);% ^6 }/ U/ s1 L5 [. [1 l
  28.             // [start, index] 之间的包裹使用 box 装* @. j- S1 W. j0 }5 T, w
  29.             result += (long) box * (index - start + 1) - preSum[index];1 ^* f' b! J' z, ?9 A' L
  30.             if (start != 0) {
    8 `5 t. Z* m* R
  31.                 result += preSum[start - 1];- `) O6 q- t$ S5 _
  32.             }
    6 V) z' }) L) k' q
  33.             start = index + 1;4 U  T. E3 v" L7 t* W
  34.             if (start >= packages.length) {* d2 d) J0 C4 h: ]( I- d
  35.                 return result;
    & c& ^, X( a+ \8 J
  36.             }7 j0 g8 D* a7 C4 f& q- d
  37.         }
    0 [1 F8 s* @9 w* _, v5 A  l, f
  38.         return -1;+ H7 c  ?+ w5 X  P
  39.     }
    / |2 @' v3 A* P7 Q# @& I6 ^1 R

  40. 5 t% ]/ L3 s+ `
  41.     private int binarySearch(int[] arr, int target) {
    $ e% K! H- {+ f, f' Z' k9 T
  42.         int l = 0, r = arr.length - 1;2 U2 G. ]& Z& o8 v
  43.         while (l + 1 < r) {8 T4 W; ?" k; v
  44.             int mid = (l + r) / 2;1 @6 J: f$ F# i& P8 O6 U) E( m; w
  45.             if (arr[mid] <= target) {
    $ T7 M+ _3 K$ p- Z9 ~
  46.                 l = mid;
    0 H7 S- ^( L( Q7 f' {0 {
  47.             } else {
    ; d# D4 g2 W6 H$ S+ Z& m; S
  48.                 r = mid;" i) [* f5 o& F* A4 B
  49.             }
    . Y: w3 v9 \+ h- Z  _& |
  50.         }/ N6 w0 V  r7 U# `9 h
  51.         return arr[r] <= target ? r : l;
    ! Z/ x$ q4 Q4 Q2 Q
  52.     }
    8 ^- [1 R5 J$ l) G% l% R
  53. }
复制代码
; g9 H; f" D, f# x1 ~0 L) u

$ n# y2 D1 `+ s4 N

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表