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

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

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

UWCSSA提醒您:

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

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

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

No.1判断矩阵经轮转后是否一致
解题思路
模拟矩阵的旋转即可。
代码展示
  1. class Solution {3 `1 y$ @1 [1 y  E  a( j( _: M/ B
  2.     public boolean findRotation(int[][] mat, int[][] target) {4 ~6 p+ D' b4 P1 k) u* Z
  3.         for (int i = 0; i < 4; i++) {! l. ?2 M; G, Z* o3 V- A
  4.             if (equal(mat, target)) {
    & d/ h& L8 q9 C& i, K' a; S9 _5 b
  5.                 return true;
    5 H( B# E) m0 N  }3 U
  6.             }
    ( ?- s' M. j" G4 ?4 Q- w5 R# T2 B* X
  7.             mat = rotate(mat);: z) J2 @' G5 m3 e
  8.         }6 U/ V% S2 x+ o) T/ h0 U
  9.         return false;  i! I$ H; ~4 J2 n: B, Z
  10.     }
    ( w) Q; x) L  L# l8 d' n( A- H
  11. 6 Q  V1 T7 J7 Q" _1 v; H# w
  12.     private int[][] rotate(int[][] mat) {
    ; m; T+ x& ?8 W5 r8 G/ T3 q
  13.         int[][] r = new int[mat.length][mat[0].length];  O/ {' R- ?% U4 B
  14.         for (int i = 0, y = 0; i < mat.length; i++, y++) {7 ?2 e& [: j  r8 Q+ H+ A) I
  15.             for (int j = 0, x = mat.length - 1; j < mat[0].length; j++, x--) {
    # ?0 t  y6 D2 m
  16.                 r[i][j] = mat[x][y];
    1 c" o4 Q" u/ Z# E
  17.             }4 J$ c( q" A% a+ V' A+ Q9 F! ?4 f. g
  18.         }
    $ M' P" C9 C5 H% a/ v
  19.         return r;
    ( \7 M5 t; ^' i/ c1 F8 q
  20.     }# v# c# w, X7 I7 h

  21. + m1 J) ]( r7 G
  22.     boolean equal(int[][] mat, int[][] target) {
    . x5 l) I4 D0 r  \
  23.         for (int i = 0; i < mat.length; i++) {3 B2 B9 Q: }3 s1 L
  24.             for (int j = 0; j < mat[0].length; j++) {
    : x5 h& k6 c8 s+ B; q  j0 _
  25.                 if (mat[i][j] != target[i][j]) {8 J5 ^+ |& \7 o2 ?
  26.                     return false;1 U0 K& Y( k: X) j" O
  27.                 }
    # `: ]( p; ^- z5 [" n
  28.             }$ E* e  J8 ^, v3 i
  29.         }
    $ m5 Z; s/ v' f. {% a; d
  30.         return true;$ e# {2 D1 t% r: M
  31.     }
    6 h% h& T6 r  U* g
  32. }
复制代码
上岸算法公开课,毫无保留地将业界面试核心知识免费传授给大家,并配有课前课后习题以及标准答案集以方便大家学习。
长达近30小时的核心课程帮助大家掌握所有面试必备知识,在一个月内有效突破算法面试认知,从而有自信面对FAANG的挑战。
  联系上岸小年糕,领取课件及视频
No.2 使数组元素相等的减少操作次数
解题思路
简单暴力地,从大到小依次处理每个元素即可。使用 TreeMap 的代码非常简洁,或者可以使用链表,速度更快。
代码展示
  1. class Solution {
    / d) L. W. [+ N* ]% _# k' ]$ {
  2.     public int reductionOperations(int[] nums) {, x, g9 m3 u1 A8 t, l8 k! i" {
  3.         TreeMap<Integer, Integer> count = new TreeMap<>();" y1 z/ a& V& z" q4 Z3 f6 `2 f' Z1 j
  4.         for (var num : nums) {
    0 n3 A- T- d5 U+ H( R
  5.             count.put(num, count.getOrDefault(num, 0) + 1);
    1 a8 T7 f3 ]$ V+ J2 b5 L9 L* N( b  e
  6.         }
      ^* c) s) A) ^' n: N" i' P
  7.         int result = 0;
    7 R0 A& z! i2 C8 h
  8.         while (count.size() > 1) {
    . A# t8 @6 H% ]1 a- m; B9 ^
  9.             var largest = count.pollLastEntry();, }+ |7 u5 Z( r$ S
  10.             var nextLargest = count.lastEntry();& h# {! b# ?. i- J0 y" k4 W
  11.             result += largest.getValue();
    / F4 P" m% M( `3 P" C$ W
  12.             count.put(nextLargest.getKey(), nextLargest.getValue() + largest.getValue());
    ' {3 d% @2 T1 I# X% f; i. E
  13.         }- Y) O  k4 b9 x/ W! i7 R
  14.         return result;
    , I+ d4 C& g1 T: f! g
  15.     }
    4 C, ^( t! F& S
  16. }
复制代码
No.3 使二进制字符串字符交替的最少反转次数
解题思路
枚举类型 1 操作执行的次数即可。
执行完类型 1 的操作之后,需要执行的类型 2 的操作次数是固定的。
我们只需要知道奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量就可以计算出类型 2 的操作次数。
每执行一次类型 1 的操作,奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量的变化都可以 O(1) 地计算出来。
代码展示
  1. class Solution {2 z4 U0 K3 r7 C- k6 f) Y
  2.     public int minFlips(String s) {
    ( {5 J' `3 w! w" v. g9 U
  3.         char[] str = s.toCharArray();
    - O7 w2 p! f, S- D! n3 R; [
  4.         // count[0] 表示偶数下标上 0 和 1 的数量& a# \* L" e5 N4 d: t/ {( t
  5.         // count[1] 表示奇数下标上 0 和 1 的数量
    0 h, m  v5 q  t( {4 h- W- G/ U/ A5 @
  6.         int[][] count = new int[2][2];0 E, t) c/ j2 _. u7 f
  7.         for (int i = 0; i < str.length; i++) {& l5 D$ S4 q; z& P& C* i9 u
  8.             count[i % 2][str[i] - '0']++;
    ' _5 }8 o" ?0 ~( y
  9.         }2 c' W' c5 \9 F1 m/ e7 X
  10.         int result = Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]);$ ^" t) p) y% |2 u1 [1 t' f
  11.         for (int i = 0; i < str.length - 1; i++) {  C, ^0 z" e  ^, K
  12.             count[0][str[i] - '0']--;6 T/ _$ J+ I( s! v4 K) s6 m
  13.             int tmp = count[1][0];
    * b- s7 C4 G4 u2 N2 {; a" u3 k
  14.             count[1][0] = count[0][0];, g/ _1 V$ p9 j2 m: L
  15.             count[0][0] = tmp;# E* m+ ~3 S. z' x% X
  16.             tmp = count[1][1];% G' I) @+ ?) Z$ H
  17.             count[1][1] = count[0][1];$ L* O4 h$ P; U% Z* ?8 ]1 O% t
  18.             count[0][1] = tmp;2 ]! b; B) k. E7 ?: u6 w( B" X
  19.             count[(str.length - 1) % 2][str[i] - '0']++;2 U, }. H9 {5 g+ d
  20.             result = Math.min(result, Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]));) ~; o- Z# {) J
  21.         }
    ' }' |9 l" M: O+ x9 ?( t9 z
  22.         return result;
    ) `# j- \7 V; s' N
  23.     }$ M- Z- `+ Q* @; Y$ R5 a
  24. }
复制代码
No.4 装包裹的最小浪费空间
解题思路
二分查找。
对所有的包裹和供应商的盒子都排序,然后依次枚举每个供应商即可。
计算一个供应商的盒子的浪费空间时,从小到大使用每种盒子,每种盒子尽可能多装包裹即可,使用前缀和数组和二分查找可以快速计算结果。
代码展示
  1. class Solution {
    0 m8 R& R. G+ B
  2.     public int minWastedSpace(int[] packages, int[][] boxes) {
    / O3 \2 ?6 j4 _8 s( V
  3.         Arrays.sort(packages);
    # ~% i' s. p% N) D" e( w
  4.         long[] preSum = new long[packages.length];  ^. ]; c$ E& y% g
  5.         preSum[0] = packages[0];
      ^( H. y0 X" G! ^8 |, s' S; Z
  6.         for (int i = 1; i < preSum.length; i++) {/ E1 R2 P( i, u0 P  U+ q2 k
  7.             preSum[i] = preSum[i - 1] + packages[i];- z0 ^4 R  j% w8 y; Z2 o# N  ]% R
  8.         }4 L" b+ Q! Z& k! {
  9.         long result = -1;
    5 V) x  p+ s# p' H' ^% k: G: W
  10.         for (int[] box : boxes) {; [$ }1 M" ]+ W1 h8 p
  11.             Arrays.sort(box);6 F# k( ^& {2 o$ J0 l
  12.             long t = waste(packages, preSum, box);
    ! b6 z7 C5 [* |- f9 o' ^
  13.             if (t != -1 && (result == -1 || t < result)) {* x: {- m0 l7 S
  14.                 result = t;2 K1 S* t' r7 y, p1 B  T9 T6 J
  15.             }& ^- y* W/ E' w& I+ c, n( ]
  16.         }6 `3 X% z1 }8 T' ^+ o: ]$ C
  17.         return (int) (result % 1000000007L);
    7 d. a. L& B3 z: r/ r9 u- }3 n
  18.     }
    $ a' e5 z* s* j$ ?
  19. ) X' H) P  R2 Y0 }- X, V5 s6 H7 q1 M& q
  20.     private long waste(int[] packages, long[] preSum, int[] boxes) {. c. a2 v0 n; V5 K
  21.         int start = 0;
    1 ?. E# O4 U- M% s- ~+ ^" X4 S
  22.         long result = 0;
    - |0 e; e: ]6 z8 `
  23.         for (int box : boxes) {1 A4 n/ |! T6 i% v
  24.             if (box < packages[start]) {4 d% J9 T( A  P4 q; P9 N- D- b
  25.                 continue;) G, P$ K! o/ i4 {) @  V
  26.             }
    9 W, U$ i$ i$ s' x
  27.             int index = binarySearch(packages, box);
    " k/ e$ i8 w- k5 p( }/ K% }( l
  28.             // [start, index] 之间的包裹使用 box 装5 h$ L+ F! T2 i9 p- t5 F( x
  29.             result += (long) box * (index - start + 1) - preSum[index];$ k9 X$ s, t% b
  30.             if (start != 0) {
    4 y2 I  w7 J% k! H
  31.                 result += preSum[start - 1];3 ~* g/ [3 ~( ]) f
  32.             }
    # Q4 |* @7 k1 }3 e; C+ `2 K' Z
  33.             start = index + 1;
    4 \* ?) Y) U' V
  34.             if (start >= packages.length) {+ S+ [+ A( J! o" z) U
  35.                 return result;, F: R7 \* G0 z* ]8 _! b) }
  36.             }
    4 {( E% e+ ]  a/ o2 e3 s3 L6 v
  37.         }
    . }$ j4 m* o' I/ s! E% t) N2 r
  38.         return -1;2 j; i9 q4 V! Z1 A8 I4 D
  39.     }4 c6 D7 G: _( B8 [
  40. $ F' P# \$ l5 s1 v6 i! k$ o% \
  41.     private int binarySearch(int[] arr, int target) {. j1 a8 R( m$ Q( M- |. W6 m
  42.         int l = 0, r = arr.length - 1;
    ( |2 t+ X% r( A8 A5 I- O7 c
  43.         while (l + 1 < r) {
    ( y+ @! V! {2 g
  44.             int mid = (l + r) / 2;
    2 O9 J* [' U: `) z3 U
  45.             if (arr[mid] <= target) {
    ! R% i# ^+ B6 h; {
  46.                 l = mid;3 a* k. r; d' |) Y) m4 I  L
  47.             } else {5 j& i/ |5 q8 B* O/ g' v5 W/ ]
  48.                 r = mid;
    " V+ q  g% G. {% `2 y8 j9 V
  49.             }
    4 \, \- }( {5 W
  50.         }+ S$ l: O8 v; C, F+ O+ P
  51.         return arr[r] <= target ? r : l;
    2 M/ s* h' r* F6 M* J+ o" w) k
  52.     }- S/ u+ H" H* ~' b8 {) T3 X) ^' C
  53. }
复制代码
7 l9 f, O3 \9 e
( t0 D3 o: _2 y  K# O) e

本帖子中包含更多资源

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

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

本版积分规则

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