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

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

上岸算法 回复:0 | 查看:2272 | 发表于 2022-4-17 17:19:24 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】6 ~' f! U% Y5 K; F. L) h, U

+ ~+ u# i" n# V5 a解题思路! V. ~& \# q4 w& g
签到题,循环处理即可。
/ d$ n7 I5 h4 H4 d, p- c' `/ s, b9 k! A
代码展示2 q3 ~' M/ h" ^

, s# G* p, }, ]& x! H# Y2 iclass Solution {
0 C8 g0 r* X) Y% m   public String digitSum(String s, int k) {
5 ~4 ^. a& I' v& C& B       while (s.length() > k) {
$ H9 ^) [% N2 y$ V) s" t1 j           StringBuilder builder = new StringBuilder();
" n: H6 L/ y3 k+ u$ q6 o           for (int i = 0; i < s.length(); i += k) {$ E9 g/ ]$ }1 E
               int sum = 0;. h6 v4 v' P) x' p8 X; l8 o* r
               for (int j = i; j < i + k && j < s.length(); j++) {
8 F7 t0 ?; g' P: w: S$ d  z# U                   sum += s.charAt(j) - '0';
) r% U* k- [& E- |              }
% W- w8 C# ]6 Q) A/ r6 r               builder.append(sum);
$ R9 f0 Z. \0 o6 H* ^          }' f( X& l* B7 o- ?+ Y
           s = builder.toString();
; I. u6 H3 S0 m; d# r2 q0 ?      }4 N* U5 @" g" O2 R: s8 u* ?# H
       return s;
5 @' x" T; t" G# f8 @: n$ C  }
( Z& O9 m! X& A9 A" Q+ ?}
# ^. ~9 m. X* T/ n
& M, J  p0 N* q+ ]. o
4 m3 X: S/ i- U0 J: {【 NO.2 完成所有任务需要的最少轮数】& \& U6 c( o0 U$ w# R- M8 q
, S+ \5 P( E3 d9 o* W  k$ c
解题思路
- ~) J: N2 s2 a% v/ U使用 Map 维护每种任务的数量,然后使用 dp 求解。2 @# F$ F& {% e+ D! a; ?
7 N: W4 s; [: W5 v8 f: [0 K5 x& c8 l
dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
+ @3 q  @) l6 R! x1 i" }- Y% O' n5 x
+ b1 }* z1 K+ f8 F# E代码展示
1 m4 F6 x# S+ X2 I8 G6 g- Q7 ~+ q% ^; ]" f% ~
class Solution {8 O: X0 y. I( m1 d$ X. v, Q
   public int minimumRounds(int[] tasks) {8 r+ g" Q& b1 F' S9 P9 I2 H
       Map<Integer, Integer> count = new HashMap<>();
$ e" \2 Y, D% o) `3 Q2 c       for (int task : tasks) {
6 U9 p5 o, k6 F5 p6 Y' V' @; U           count.put(task, count.getOrDefault(task, 0) + 1);! q2 M  I1 ?/ w. a6 h
      }
0 M8 N5 U+ `& v/ I       int res = 0;& o) b7 ?9 P6 P
       int[] mem = new int[100001];
+ W8 w- R% I/ w* }       mem[2] = mem[3] = 1;
8 r. l4 W/ J0 T1 _, t0 x" H3 L       mem[4] = mem[5] = 2;
- E! D" _2 s$ R       for (var entry : count.entrySet()) {
8 d$ L. Y0 |! }/ q; x" V' s1 t. a           int cnt = entry.getValue();
0 }3 r' ^; p) @2 [! ]' Y) u2 w7 w, F           if (cnt == 1) {9 c# b9 d$ W$ k8 A1 E0 D/ q+ l6 f
               return -1;
+ E! T- ^8 Q7 I4 R/ ?9 ^          }
! K- r9 g9 h5 I7 R$ J* P/ V           res += dp(cnt, mem);5 R) j- L+ _4 a
      }
  j* z0 n) m8 @8 ~- H1 v4 ~       return res;
- A( x/ }* s5 X! @0 h/ g  }
  l( Q: u3 f2 |' u( K3 x- s' ?/ M% _; V! ^) b4 m( V
   private int dp(int cnt, int[] mem) {) A$ t; T3 n" [% z  l) D
       if (mem[cnt] > 0) {
2 R( d) s% v5 d: q( n& ?           return mem[cnt];; j! E1 @8 o* x& J
      }$ e! f8 E( v8 i- f, b9 ^, t. ^
       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
* R3 _. |0 {3 X- F/ \9 b9 H       return mem[cnt];
9 U, w, K( _6 a: R7 r  }
9 n5 n4 i7 y) d: R4 a$ l1 z5 ^}
) o. n- f' [6 w8 |3 y: G/ W- }7 X  t4 h+ ~# `/ l) M
( W# C- H) ]& v* S( U
【 NO.3 转角路径的乘积中最多能有几个尾随零】. b# K- }8 F6 y" T- e% e3 w) y
) [6 j& X$ k( e" O0 d- B5 V/ v3 i5 }
解题思路
6 B$ I: P3 [7 z* a$ S- J" s尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)
* i- C0 Q, x) a+ n# p; n5 |9 g
8 i& W: G1 b5 [代码虽然很长,但大部分是重复的逻辑,详见注释。
" G; p  D7 Q2 Y5 g9 d
+ g* N2 F; ~7 `' a代码展示. E- D6 c) m& h" g8 \
; D4 g4 F6 ]% u  \
class Solution {" h. p% c! J% Y  ]& i
   public int maxTrailingZeros(int[][] grid) {* V6 _) j! s# m9 R+ E5 T% B+ z
       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
. X, V" M. R0 |" {* X" h       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数
+ E7 {+ Y7 I* c- x+ Z! f! g       int[][] up2 = new int[grid.length][grid[0].length];
' v; O: Q' O8 u0 [) g1 F6 X       int[][] up5 = new int[grid.length][grid[0].length];
" k+ C( h0 u  D6 r, X: U       for (int i = 0; i < grid.length; i++) {
2 ]/ x7 z+ T; ?2 w2 N           for (int j = 0; j < grid[0].length; j++) {+ G  P1 u' J8 K* ]
               up2[i][j] = num(grid[i][j], 2);5 a) s2 z" u# R7 W: f
               up5[i][j] = num(grid[i][j], 5);7 O' J% m0 M/ A3 z1 R( r. z4 H) j
               if (i > 0) {2 x9 w4 e) _* E5 g8 I( h; K
                   up2[i][j] += up2[i - 1][j];5 ~1 D* S9 l3 A  Y" h+ L, G
                   up5[i][j] += up5[i - 1][j];! t! a% H+ m/ A
              }. s9 s* G8 M1 a" B+ J6 M  [$ d
          }
, i. g0 ~- n: ~% E; I9 @$ N! T      }& h- ?6 X* ]! o9 x' j# t
       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数/ g4 c: M$ x; R, c% U! _8 S
       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
3 p( Y5 ^, B3 f0 o. Q* A- v       int[][] left2 = new int[grid.length][grid[0].length];3 q/ \8 A$ A: d: I( Q. J
       int[][] left5 = new int[grid.length][grid[0].length];; ~7 L$ o9 d) R* x* C4 X0 ?  f+ ~
       for (int i = 0; i < grid.length; i++) {! t5 I1 ~/ s  G  x7 ~
           for (int j = 0; j < grid[0].length; j++) {
  E1 Z5 u3 `' \3 `               left2[i][j] = num(grid[i][j], 2);8 U' M0 ]0 ?6 ?) Z8 X
               left5[i][j] = num(grid[i][j], 5);5 I4 ]) x, r" p# B/ }
               if (j > 0) {+ m! @0 J+ x5 W/ i1 q" Z8 {
                   left2[i][j] += left2[i][j - 1];% V3 i3 ^9 ?+ T- Y9 o4 d
                   left5[i][j] += left5[i][j - 1];
+ g- e# Z1 @" c2 o, A1 q2 O              }
8 X7 v# P: X4 N$ E2 j$ h          }
0 n9 D* l- Z/ C; G$ O$ {4 L      }6 A  R, q( Q1 j1 }. p' i; G
       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数* @7 \) s7 |6 P9 \9 c! A
       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数2 c3 U4 v  \2 o3 D
       int[][] down2 = new int[grid.length][grid[0].length];
! i, X( u: y/ Q) m' S  R       int[][] down5 = new int[grid.length][grid[0].length];
5 x8 K1 q8 V- ]7 q$ T* m       for (int i = grid.length - 1; i >= 0; i--) {
# m' E) R2 d+ _% ^5 G7 g3 f           for (int j = grid[0].length - 1; j >= 0; j--) {3 J  g& n% E% G: n- C* Z
               down2[i][j] = num(grid[i][j], 2);
4 y. z4 f$ I7 v3 ~               down5[i][j] = num(grid[i][j], 5);
9 N. u* a; |1 p& o5 {: ^9 G               if (i < grid.length - 1) {
, I) j1 p. a; p; j                   down2[i][j] += down2[i + 1][j];
  ~4 h+ s; f* n                   down5[i][j] += down5[i + 1][j];8 z4 E5 B" y4 k: G
              }
: o$ r: ^5 r3 T          }* T- ]# @4 \" w9 ?/ x8 I
      }
, G! w  D, Q8 N& C       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数9 D4 w" {- H' A( ]8 p6 `
       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数1 n* ^4 m2 ?! c4 \1 u: d7 s. K0 b- N
       int[][] right2 = new int[grid.length][grid[0].length];
& g8 _$ I1 G& w( W' W       int[][] right5 = new int[grid.length][grid[0].length];; r3 i0 P# w; h2 D' h" K
       for (int i = grid.length - 1; i >= 0; i--) {0 j9 T& f) C+ E( \
           for (int j = grid[0].length - 1; j >= 0; j--) {6 `, x! U3 }7 Q! S! Q0 G
               right2[i][j] = num(grid[i][j], 2);. i( j& k' ^/ e) o
               right5[i][j] = num(grid[i][j], 5);
" a; o3 b1 i/ `+ `4 S! [9 s               if (j < grid[0].length - 1) {3 v: z  t& B" t; X3 ^
                   right2[i][j] += right2[i][j + 1];: x9 {! D- x( v' |* p0 v, n4 v
                   right5[i][j] += right5[i][j + 1];! s+ d4 c8 J+ W) D
              }
+ h5 c0 u0 X0 O6 V4 R          }/ q' S5 Y& @, u. D& ?+ O+ E, v
      }
, M- w  X' M$ b. z- m( c8 \% l8 p- O* F7 m4 R! U/ @: i
       int res = 0;3 v# W+ _6 i) T! s% G% x' k' m
       for (int i = 0; i < grid.length; i++) {2 @, P) L. k, R, x
           for (int j = 0; j < grid[0].length; j++) {
# T! J- F" `& d( M+ s7 Z+ S               // 有四种转角形态
5 W8 b7 p. n4 e- W# F# g               // 1. up + left8 N: K# |) r$ j% K( N
               if (i > 0) {
' r5 I3 X- p- C0 b* s5 f                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
- ?. ], }* ^4 ?4 G3 }2 O              }
( v* f) K2 S, F4 k               // 2. up + right
5 S, D( d% `" L! [               if (i > 0) {
: k2 q% z6 h% O% b1 p) E8 {                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));
" b# E# q( P+ f+ H7 k8 [9 N# s              }
! h( c9 |3 `" z7 F               // 3. down + left
! p3 C# I. f: F1 W1 n               if (i < grid.length - 1) {9 C. [& C& G# c9 |2 y6 x
                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));4 G. F% w# E4 }4 A$ _
              }' p6 y1 x& i9 W4 P3 G" q: ]8 |- Q
               // 4. down + right, O* N" }; y+ O/ A
               if (i < grid.length - 1) {$ l( A) w3 M& L! B
                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));! Z1 K$ B! a% X. Q& p, R7 ]
              }1 m! J5 S: l0 N/ m1 \
               // 不转角! ]1 o# [8 U" a% N" M5 z7 {
               // 5. up/down/left/right
7 M1 S4 F/ S" c5 M( m/ r               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));" E0 Z# o% x7 R% f8 P: S  A; y5 T
               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));# e. t3 v4 J: H
               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
: M! M/ e$ E2 t  V* x               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));& K( R' M! k9 c$ X) k& H" l& L
          }
1 g( m2 M+ l% O1 s6 I, T      }& y1 X5 D3 K7 ~6 R
       return res;* W0 r* k' ^/ w+ r% w& m! a: |. G
  }
- W4 E! n! d; J, x
) [; _% t6 h3 D& E4 Z; Z   private int num(int x, int y) {- a; q& w( r1 `+ s
       int res = 0;, L! X5 X# _% W+ C0 d
       while (x % y == 0) {, p) Z/ m) p- f  Z# x6 M
           res++;
3 B; l2 I/ _  U$ x  W; i- p           x /= y;$ C' w6 k" A* K# W2 t% M7 L" W9 T
      }
  z! E4 L7 F% ~3 A       return res;
  h5 A0 M0 j3 i( C  }9 A7 W6 s% H( ]/ {- ?6 E  e3 \# f6 L
}
* \9 b, L( o3 F' M4 u0 S" Y
, h6 h" G7 R4 t* c1 P9 a( m【 NO.4 相邻字符不同的最长路径】( X+ E9 f2 `/ ^' H3 S( p7 r- t
- g" M5 D7 ?3 e. \2 i9 N2 J/ K
解题思路0 p/ l6 g) ?: v3 w5 K
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。5 p5 W' t+ c) j4 j5 o
# T) j( {6 s9 D- Q  {/ S5 P- F
代码展示. E, w& e$ D% q$ J# Q2 M
, g+ e( _* {! i0 y2 X5 }  \
class Solution {0 j9 h2 W. l* r+ f  ^- @7 [
   int res;/ \5 y) {8 X2 X
5 S+ G9 s5 {% s
   public int longestPath(int[] parent, String s) {' w* x# F: B1 h5 ~: i
       Map<Integer, List<Integer>> children = new HashMap<>();
1 L4 ^( F1 H7 G* l! V1 V/ t$ [       for (int i = 0; i < parent.length; i++) {
' ^3 o) s  X" ^           if (parent[i] != -1) {% q- Y7 y; k( B3 _; I0 L
               if (!children.containsKey(parent[i])) {
5 T2 ]4 [; U% q3 l% f8 }2 B0 ?                   children.put(parent[i], new ArrayList<>());
7 z7 {$ R- N6 I% `0 [2 a8 c              }
. G1 E" P# j( x/ f2 v1 W( e4 A               children.get(parent[i]).add(i);5 T( }( a$ A# |$ K) O
          }8 l9 i. q6 c$ K( a- r7 w& n
      }
$ W" ]8 {0 [. @' Q# N! n0 ]- ^, r- U) X6 A& V- l# T
       int[] maxLength = new int[parent.length];2 [  d* U( {8 k) ~: G7 O+ L) Y
       res = 1;% U5 h, \5 a0 r( I4 M/ c) J
       dfs(0, children, maxLength, s);
  j& ~( ^( [' B, ^       return res;9 I& n& ~6 Y4 Y1 d4 M  O, l0 c5 b
  }
$ j9 B9 u1 X; z, ^
1 N! x8 H$ w) g; w; J   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {; ~& [, R! s! ^" A5 u; d0 p
       maxLength[cur] = 1;
) {' \6 X/ m$ d( j" I       if (!children.containsKey(cur)) {$ m& x# c  v; M5 T# _! M! c
           return;
2 @1 q* |* c& w9 s; Q      }
$ t# v# \- k% _2 y- j       var curChildren = children.get(cur);
% ^* r6 Z$ ], i7 V9 f! ~7 f       int first = 0, second = 0;: i  D% K  I( L0 K6 [
       for (int child : curChildren) {
  I7 l3 E" K' b  t! `9 ~' ]           dfs(child, children, maxLength, s);
3 M0 {0 N9 O: a* Y           if (s.charAt(child) != s.charAt(cur)) {
7 m- x& q- i& ^! H4 m  a. T4 ~               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
- O. I) t% d# z$ G               if (maxLength[child] >= first) {5 d7 {1 p7 f0 O9 ?5 ]1 L
                   second = first;8 n& |) T; j/ t0 {0 w
                   first = maxLength[child];
8 O5 Q+ ?, o8 t1 x7 l              } else if (maxLength[child] > second) {; W4 S2 }; Q  r) \. h$ J7 Y- v
                   second = maxLength[child];. c- I; f! e( C* m
              }
+ q& s- P. C6 L) Y7 }* J* e* T          }
# E* m4 w* {6 Z/ y) P, R- p' j      }
2 F' z! S3 P! H" ~) E       res = Math.max(res, maxLength[cur]);
6 }% H9 K) O' Q8 W' [& p       res = Math.max(res, first + second + 1);5 Y% \4 U! m$ \& a
  }
& k, L3 ?& Y2 J. Q+ Z$ |& Y! K}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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