找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

No.1判断矩阵经轮转后是否一致
解题思路
模拟矩阵的旋转即可。
代码展示
  1. class Solution {
    ( _4 n0 @* M3 ]0 f0 K* B$ e
  2.     public boolean findRotation(int[][] mat, int[][] target) {& O! s  {+ r! B+ m% d4 z  S
  3.         for (int i = 0; i < 4; i++) {8 ^! V& S# ]8 |
  4.             if (equal(mat, target)) {
      A. y* i8 c2 F$ N& s
  5.                 return true;9 c! |5 o4 l( C: ?4 N  }5 d& Q$ a
  6.             }+ Q/ C9 X  [: M/ ]+ e! o( I
  7.             mat = rotate(mat);
    7 x; t! \" t4 Q
  8.         }
    : S/ U0 L$ B0 l% p6 @, A
  9.         return false;7 |; k" y( [; N3 E! e. ?; L
  10.     }
    7 z/ M6 {2 g3 _

  11. $ }7 }  H) D# Z, u. c
  12.     private int[][] rotate(int[][] mat) {
    ; M4 V' g0 g) ?3 p
  13.         int[][] r = new int[mat.length][mat[0].length];. Q) \" z) f( H
  14.         for (int i = 0, y = 0; i < mat.length; i++, y++) {2 P! R3 T6 E7 B1 J$ X/ ]6 ?3 }
  15.             for (int j = 0, x = mat.length - 1; j < mat[0].length; j++, x--) {# Y  ~9 }5 z6 O& f' p
  16.                 r[i][j] = mat[x][y];
    5 }' D7 U  D* Z6 J
  17.             }  ]6 M1 U3 G+ j/ o( V7 W3 R* Y
  18.         }8 I+ p0 D! u, n$ r
  19.         return r;
    / `, g+ H$ n: V: e3 \
  20.     }  j/ Z, \# z$ k/ W+ c' [1 H

  21. 3 z% J4 H) r8 [
  22.     boolean equal(int[][] mat, int[][] target) {
    - k( t0 F6 o' |  g5 ~7 N* g
  23.         for (int i = 0; i < mat.length; i++) {
    6 z) S3 |9 m& z7 J; b: F) o2 m
  24.             for (int j = 0; j < mat[0].length; j++) {+ A/ T& r. P. g' D6 D
  25.                 if (mat[i][j] != target[i][j]) {7 U! y- Z6 P$ ~+ i- l: A# w6 c
  26.                     return false;
    " ~6 h) G6 Z1 n9 Y. f" r
  27.                 }
    : q# \  y8 }/ c$ h9 E
  28.             }
    3 ~) E1 e: U3 h0 T% R5 _+ ?, E
  29.         }9 N2 p: M1 ~1 N
  30.         return true;
    ) j* P& `6 M8 r# e7 z
  31.     }& ]4 G1 P0 a1 i
  32. }
复制代码
上岸算法公开课,毫无保留地将业界面试核心知识免费传授给大家,并配有课前课后习题以及标准答案集以方便大家学习。
长达近30小时的核心课程帮助大家掌握所有面试必备知识,在一个月内有效突破算法面试认知,从而有自信面对FAANG的挑战。
  联系上岸小年糕,领取课件及视频
No.2 使数组元素相等的减少操作次数
解题思路
简单暴力地,从大到小依次处理每个元素即可。使用 TreeMap 的代码非常简洁,或者可以使用链表,速度更快。
代码展示
  1. class Solution {  @6 ]0 S, P. V0 k" L) d0 `5 Q
  2.     public int reductionOperations(int[] nums) {0 V* C! @! E, q' L2 ]8 R
  3.         TreeMap<Integer, Integer> count = new TreeMap<>();
    2 t$ z1 ~& ^2 \
  4.         for (var num : nums) {
    $ g6 {6 a& X4 J* c; a+ H
  5.             count.put(num, count.getOrDefault(num, 0) + 1);1 G4 L; k' e* m2 w
  6.         }
    ! i; q) c3 Q0 z& L5 U2 P
  7.         int result = 0;
    ; ^% x" O  O" J
  8.         while (count.size() > 1) {
    0 T. x3 n* ]8 Q6 `6 v# |7 _
  9.             var largest = count.pollLastEntry();! N5 k' H# k+ S- F
  10.             var nextLargest = count.lastEntry();
    7 r6 T; e3 O. ^# X; j
  11.             result += largest.getValue();
    " z( p) L3 u0 v7 K
  12.             count.put(nextLargest.getKey(), nextLargest.getValue() + largest.getValue());0 i0 V5 i* _, h3 q9 C& O* w
  13.         }
    / m' |: o1 \5 o3 _9 n" t
  14.         return result;
    4 ]4 D3 x5 }7 O" Y% _: ?9 O
  15.     }, x5 N% C" ~; w  R6 I8 I
  16. }
复制代码
No.3 使二进制字符串字符交替的最少反转次数
解题思路
枚举类型 1 操作执行的次数即可。
执行完类型 1 的操作之后,需要执行的类型 2 的操作次数是固定的。
我们只需要知道奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量就可以计算出类型 2 的操作次数。
每执行一次类型 1 的操作,奇数下标上 0 和 1 的数量、偶数下标上 0 和 1 的数量的变化都可以 O(1) 地计算出来。
代码展示
  1. class Solution {
    ! c( q$ N0 m. Q  \# [
  2.     public int minFlips(String s) {+ j+ j0 e2 ^  m" p, @
  3.         char[] str = s.toCharArray();
    % q5 y8 J0 e( m5 a7 P; a  O
  4.         // count[0] 表示偶数下标上 0 和 1 的数量
    : z' c/ C! K( G; z% c
  5.         // count[1] 表示奇数下标上 0 和 1 的数量
    / l2 d6 A; c  w, D4 g) V7 q6 W1 A# e
  6.         int[][] count = new int[2][2];9 K2 Q. F- @  ^! Z" A" ^7 i
  7.         for (int i = 0; i < str.length; i++) {3 t" Y0 ?$ I" S
  8.             count[i % 2][str[i] - '0']++;
    " D% z$ M2 `2 P9 M
  9.         }  s0 w* X( Q! Y! E
  10.         int result = Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]);$ o' @! g$ o- s1 q% d- K( U% \
  11.         for (int i = 0; i < str.length - 1; i++) {
    5 s, Q3 C1 S4 }% [: w$ P# B# Y
  12.             count[0][str[i] - '0']--;
    ) a7 x9 I/ i# j" U* Q
  13.             int tmp = count[1][0];
    * G  t: _# }' r6 J' ^
  14.             count[1][0] = count[0][0];2 f$ D6 R2 t( d. R% @: F
  15.             count[0][0] = tmp;
    % U- k- x$ F& L7 ]/ N* O% K
  16.             tmp = count[1][1];! v( H, B+ a# ^( X) y
  17.             count[1][1] = count[0][1];( M" [  M) C1 l) B& Z! f
  18.             count[0][1] = tmp;
    : j8 f' J# A0 T0 P* g
  19.             count[(str.length - 1) % 2][str[i] - '0']++;
    / ~1 R, |2 e' c2 N  `' }+ {# ?
  20.             result = Math.min(result, Math.min(count[1][1] + count[0][0], count[1][0] + count[0][1]));3 B3 H& {$ x8 {7 o6 g
  21.         }9 z8 @$ t+ M6 C4 X3 x- i
  22.         return result;2 m# X* L6 L( X/ S8 ~. r" n% l
  23.     }6 x, m* \/ T! V* Y% m
  24. }
复制代码
No.4 装包裹的最小浪费空间
解题思路
二分查找。
对所有的包裹和供应商的盒子都排序,然后依次枚举每个供应商即可。
计算一个供应商的盒子的浪费空间时,从小到大使用每种盒子,每种盒子尽可能多装包裹即可,使用前缀和数组和二分查找可以快速计算结果。
代码展示
  1. class Solution {
    2 V0 E" s' b* v8 M" [5 x0 s/ }
  2.     public int minWastedSpace(int[] packages, int[][] boxes) {' u, |+ O* O, B8 x. [
  3.         Arrays.sort(packages);
    1 z. e8 s! L4 U) Y4 d  z3 G
  4.         long[] preSum = new long[packages.length];
    5 p! ?# V& ?0 V  d2 {* p( z
  5.         preSum[0] = packages[0];
    8 D! C' f* w4 ?' d9 R& R
  6.         for (int i = 1; i < preSum.length; i++) {; X. H- c: d( O' c: I0 F5 ]$ {
  7.             preSum[i] = preSum[i - 1] + packages[i];
    3 X+ @; f# e% v' c" ~" n
  8.         }2 j& p; n# j* N0 f
  9.         long result = -1;
    8 V4 u$ u" q9 n4 h' b; f
  10.         for (int[] box : boxes) {
    7 s% t6 ]  |; k' B, l
  11.             Arrays.sort(box);
    2 U) J1 o1 b, {1 V+ I0 e+ B
  12.             long t = waste(packages, preSum, box);
    - L% x! k: m  Y7 o" X
  13.             if (t != -1 && (result == -1 || t < result)) {- g& f: i, U. o2 g7 m
  14.                 result = t;7 |7 A( t' m6 J1 K7 j, H; j9 x
  15.             }* t: o. v; a6 _) W1 V& T- Z! Y& c
  16.         }5 k5 s0 D; @" o7 r, Y* W5 f& y0 l
  17.         return (int) (result % 1000000007L);5 l. \  G1 o9 ^# }  K- C5 o
  18.     }
    : h( t* K" H1 o8 a6 [

  19. 1 G7 p- M& C. ]2 @3 T/ J
  20.     private long waste(int[] packages, long[] preSum, int[] boxes) {; ?( `  g2 @5 Z$ D$ D
  21.         int start = 0;7 z" z+ @4 h8 o2 U$ P% s+ W5 K
  22.         long result = 0;
    $ o* Z& \/ L9 e1 b" U  }- ]) G
  23.         for (int box : boxes) {/ O. t; P2 k6 b5 E( z0 s) X
  24.             if (box < packages[start]) {
    2 _3 S& a8 U$ t" |
  25.                 continue;
    # B8 U5 Y" j) v4 v/ |
  26.             }
    / ?( @" Y$ l% }! p2 f
  27.             int index = binarySearch(packages, box);9 K; v. i( N- O: a9 U
  28.             // [start, index] 之间的包裹使用 box 装
    3 x( B; P& y9 k3 S9 v! ]
  29.             result += (long) box * (index - start + 1) - preSum[index];' n0 x' B+ [0 V' m- |8 f
  30.             if (start != 0) {2 }- W- ]8 |+ Y+ Q& P4 b" d
  31.                 result += preSum[start - 1];
    ; Y: f+ x- j5 \0 Z3 d8 X' O
  32.             }3 k  F3 ^- L" O6 \. ~
  33.             start = index + 1;3 f. @. K) d) z- x4 p) w
  34.             if (start >= packages.length) {
    9 f/ H& K1 K! _" Y  n0 [; _% W
  35.                 return result;
    9 h1 b8 X' ]  N' K. i' @
  36.             }
    * S) e$ n2 K  _4 R2 b( _- [' N3 v" l
  37.         }
    : H& Q' L2 n) P0 K$ q/ V! S
  38.         return -1;
    ! \% V3 L' K, n# Y
  39.     }
    8 S. E' ^0 @2 u
  40. 0 [  S5 J3 k: Q/ U
  41.     private int binarySearch(int[] arr, int target) {$ l8 {, \% F6 j/ D3 J, Y, `" u, \- i2 o
  42.         int l = 0, r = arr.length - 1;
    1 X: \, N2 R2 g7 s' Y" B
  43.         while (l + 1 < r) {
    ; {4 [4 J" g3 g5 o: \. u7 Q2 S, K
  44.             int mid = (l + r) / 2;
    & y8 h/ W; K5 }, Q
  45.             if (arr[mid] <= target) {
    " y5 w; [, n* c2 {$ @5 g
  46.                 l = mid;
    9 m( ^9 E6 R2 J* M
  47.             } else {3 u& w  V3 c) }
  48.                 r = mid;$ @! j: R1 J( \
  49.             }2 X+ g: |6 D8 s0 V( ]
  50.         }
    ) k6 U- w9 D+ Z! F1 m" g$ Z; ?
  51.         return arr[r] <= target ? r : l;
    2 A9 j/ |0 x# J$ q
  52.     }8 a$ T8 [1 x; E' M! Q" x; F1 v
  53. }
复制代码

$ M# t: X+ a* u& }& F1 T/ S; ~* {. {# `- G+ V

本帖子中包含更多资源

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

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

本版积分规则

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