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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】
  U/ o/ l& t; _/ ]1 z" d. o+ Q3 X6 ?, O# b' t& I/ d
解题思路% i) E8 V* v# q* w
签到题,循环处理即可。
! b4 u) i, {7 @# S6 T7 [3 |1 ^# V5 D% V9 l. d5 S+ n/ G1 c
代码展示
* p; X2 e3 s3 ?6 }+ i7 S- {1 B8 g: P( D
class Solution {
" t" u; y9 Z6 T) V' v# ]9 v8 x   public String digitSum(String s, int k) {
/ I2 }+ f7 l+ n4 ?! D       while (s.length() > k) {
5 V! H' z5 X* X5 S- Z5 V/ S3 [6 g           StringBuilder builder = new StringBuilder();
0 r" _7 B- x0 E. t* L           for (int i = 0; i < s.length(); i += k) {: M4 T% h% M% x1 [: v2 h, M& l* x
               int sum = 0;
$ e- s5 a- f! K8 X7 P               for (int j = i; j < i + k && j < s.length(); j++) {
* l2 A) X. A1 y: U+ J8 x+ e$ S                   sum += s.charAt(j) - '0';6 a  i9 M# N$ O  v* `/ `2 G
              }. V) r+ T, m5 y) ]/ N
               builder.append(sum);( @9 R+ T3 U+ G6 ?8 K1 D: Q
          }% b; d: p& v( f) h' v: |' D
           s = builder.toString();
6 k, `  F; M+ k6 r0 z, ^. R      }6 I/ Q% g1 H' F- }/ Y
       return s;
/ a' e9 D3 c. ?6 H) R7 X  }) \* U0 l" N  l
}# [2 Z2 G$ R$ O# w8 H- ?, p
& v$ f& F- s6 t4 ]

- Z! n3 x4 G1 a# U8 T【 NO.2 完成所有任务需要的最少轮数】
0 h: h" N4 r! V: O7 n
1 y. b. H! w$ B1 l0 ~! F解题思路
; r3 ?0 q9 z+ v使用 Map 维护每种任务的数量,然后使用 dp 求解。' `7 Y8 M6 A/ }4 S. u

& h& U# D* m8 Q7 [dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。8 o" }& u) Y* a" ^9 D) |* ~
) g4 c2 L) z. t1 M$ b9 @6 R
代码展示* d6 f: W% }3 i; ~6 @2 S

3 g9 u% F  x3 zclass Solution {' V6 \$ f% g3 m: d5 g$ W3 N3 k$ i3 w
   public int minimumRounds(int[] tasks) {6 l4 ^: i0 Z' Q# j
       Map<Integer, Integer> count = new HashMap<>();9 p. r6 n" b2 P! o5 H8 N# Z! N
       for (int task : tasks) {+ W; w0 [; A9 i& a+ y  Y( q' }
           count.put(task, count.getOrDefault(task, 0) + 1);2 U5 Z! `' t9 v3 {" T) g. P
      }* Q0 @; ?0 p$ a! Q, X' R6 ?
       int res = 0;3 Z1 y+ U3 ]1 m5 ~8 c' Y; \
       int[] mem = new int[100001];7 e5 u' l/ h6 t+ D, X* H
       mem[2] = mem[3] = 1;5 G6 m6 U7 D0 g/ ~+ J( X! F
       mem[4] = mem[5] = 2;1 a  q% l& [1 \. X) i* ~' S1 ]
       for (var entry : count.entrySet()) {
7 e3 t( i& t' _: c" h4 E           int cnt = entry.getValue();
/ d0 ~9 T5 \; W) z- w, n; U4 n           if (cnt == 1) {
$ P$ q" o- s% ?" I# T# v: Y( C8 n               return -1;; F- u) n- g  f; u% F+ f/ V9 M8 e
          }
6 t/ l% N" ]8 ~2 k# @  y0 M8 |           res += dp(cnt, mem);- v- b, A2 ]' o. X+ d; \
      }
, T1 q  M* v0 }& B% U0 P& b& p0 ?       return res;
% ?5 |) H" @+ n" D* B- c  }( p2 y  d2 C: @% b7 {6 q

4 ~% W, c: J) m+ B* p" y" ^; X   private int dp(int cnt, int[] mem) {
  L0 z  Z4 o) p* U       if (mem[cnt] > 0) {
; k& f$ D; r( k: H           return mem[cnt];
& u! i4 J' y& N" i' G      }& f1 ~3 A7 m8 }
       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
$ D" V: j. p; Y( ^" d       return mem[cnt];% B# R) R) u+ k1 K
  }; y9 e5 }+ z/ D6 s9 U- B: b4 W
}
' ~% o" H0 ]2 c
6 r/ x/ F5 F3 a, c7 Y& p* W
* v  w: F1 y- [1 Q7 ^【 NO.3 转角路径的乘积中最多能有几个尾随零】' m% j3 |; w# X+ q: v& U: |

: }  P9 c, i7 m* R* @" E解题思路
* k- p, U7 @2 s+ N$ r$ g; q尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)
: t% d3 T8 E0 Z" d; B1 C' x5 S5 P; k
6 p. q6 {- G& v代码虽然很长,但大部分是重复的逻辑,详见注释。5 \3 J; p3 G' z4 t% ~) j
5 J+ n* E" c3 E% R2 a/ _0 `" \
代码展示
8 s/ i) a7 y! J$ x2 o8 l% H; l. U5 x, T' A; x, \* X  I
class Solution {) B( X' M# }9 H# j1 S$ R
   public int maxTrailingZeros(int[][] grid) {* g  n4 U1 z, g+ w
       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数; \( m+ |5 G3 x& Q* @7 t  n
       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数6 r8 [2 ^1 P3 M1 d
       int[][] up2 = new int[grid.length][grid[0].length];1 F, o5 c5 }2 C" M! K, |- @
       int[][] up5 = new int[grid.length][grid[0].length];
2 _1 G4 d9 Y: r8 U; l% Z       for (int i = 0; i < grid.length; i++) {
' z+ Y' B8 X( q  Q  P7 p           for (int j = 0; j < grid[0].length; j++) {4 m3 i8 d3 @+ B# n# @
               up2[i][j] = num(grid[i][j], 2);3 W8 A  B# w" H0 h5 E! @
               up5[i][j] = num(grid[i][j], 5);
! i- d  s& Q: c2 s               if (i > 0) {
; v/ }+ X( |' p3 N                   up2[i][j] += up2[i - 1][j];
7 G5 Q# @5 `  s. l& {: d                   up5[i][j] += up5[i - 1][j];
$ B" ]& w" T& \/ U$ h' Z3 O. k              }7 N& n/ h" `6 m- s9 H' X
          }
0 e2 K) q0 Q8 Q: v      }
! S/ A* A3 ~3 U2 `  q" R       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数0 t: s) R1 a% Q1 A
       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
9 Y% `. V8 s4 \       int[][] left2 = new int[grid.length][grid[0].length];
" c$ X1 Y" ]/ H       int[][] left5 = new int[grid.length][grid[0].length];' Y1 S+ f7 q$ ?. m
       for (int i = 0; i < grid.length; i++) {6 D! z: E- W% k. \" w
           for (int j = 0; j < grid[0].length; j++) {
' F" J, ^2 G1 Q) L6 U' `  C; l               left2[i][j] = num(grid[i][j], 2);" {3 G# }4 M, c1 i/ ~5 |
               left5[i][j] = num(grid[i][j], 5);# p2 n# B( t* g5 }! p% @
               if (j > 0) {
, }  T& g, e; f, T& y  \1 \                   left2[i][j] += left2[i][j - 1];
+ h2 W! Y8 f% R5 C                   left5[i][j] += left5[i][j - 1];
- C2 l2 }3 a" A- K              }  f2 G) U  b$ W" D7 l1 |' f- ^# j" N
          }
% m; `, k5 A: C+ @      }
3 g% z+ P+ {+ i5 P       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数4 z6 h9 B" K* d- @, x
       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数7 p0 r- f% v0 K. O% n
       int[][] down2 = new int[grid.length][grid[0].length];( C- B; J" e; s: h2 r# B
       int[][] down5 = new int[grid.length][grid[0].length];, ^3 ]  F, b5 d3 u4 A( ^
       for (int i = grid.length - 1; i >= 0; i--) {. ^! e8 O( |( o6 ^, |% H
           for (int j = grid[0].length - 1; j >= 0; j--) {+ x0 m- l9 d. l! i% r4 ~  a/ Y
               down2[i][j] = num(grid[i][j], 2);0 U) c1 ?9 c, @% i. i, L- W$ h
               down5[i][j] = num(grid[i][j], 5);2 U1 X+ u  W' K. I- n7 L
               if (i < grid.length - 1) {$ Y& s0 s6 m7 U% i( u
                   down2[i][j] += down2[i + 1][j];4 }+ r1 N: ?; h  A
                   down5[i][j] += down5[i + 1][j];7 t8 }# K/ g' D
              }
- w  `" x4 x# ^  ^* U! o* k          }2 B+ {* o( D. m* O9 p1 ]
      }
  j) J9 a; G$ Z7 V! h% i. ^       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数
1 e* u9 j' ^- o$ w2 o9 `+ q       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数; s3 Q" R' \. ]% \6 N
       int[][] right2 = new int[grid.length][grid[0].length];/ o; w5 @4 S+ O. Y, R3 ?
       int[][] right5 = new int[grid.length][grid[0].length];; u- n( w& k8 ^
       for (int i = grid.length - 1; i >= 0; i--) {
6 g# ~, _9 p' E" u. m% g$ ^! I           for (int j = grid[0].length - 1; j >= 0; j--) {6 }/ e) o9 H9 q' t$ v
               right2[i][j] = num(grid[i][j], 2);7 s! O' h4 k$ l7 }. z( D9 X7 s
               right5[i][j] = num(grid[i][j], 5);
' r/ u: O# W  e2 l$ _/ o! g               if (j < grid[0].length - 1) {8 I% `6 C/ O" u4 _
                   right2[i][j] += right2[i][j + 1];. b3 k! H; E* S1 I1 l# s
                   right5[i][j] += right5[i][j + 1];
2 o7 F3 S. x/ b+ t, T              }
* c7 s  c9 z' m. `! j7 \# q          }
/ F. `4 b1 V4 T- d, r* [/ N; v3 u$ X      }
8 S6 B9 ]9 x" G4 R) ^# L% i, g0 e' r: A
       int res = 0;$ ?6 r, P4 x" A# e; t
       for (int i = 0; i < grid.length; i++) {
. \, ]4 F% R5 L5 B" d           for (int j = 0; j < grid[0].length; j++) {' I# R" |% ~& x) m
               // 有四种转角形态
: S) q: g0 {5 ~- u8 w% p               // 1. up + left
( @  F& ?" ?# b' n               if (i > 0) {
' _3 Z7 ]5 H2 Z: }6 F& ~1 ^                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
/ O1 a" m& L1 f. ?" F              }
2 {& U2 @. [! m               // 2. up + right
6 E+ K- q0 \, D) ]% O( e               if (i > 0) {
! S/ O: \  A, Z                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));
- w+ C8 k, |5 S" P" h              }; T& y" x  X( p. j) ?' P* p! g
               // 3. down + left
7 J/ n7 o& j1 v9 v% G/ B' ~               if (i < grid.length - 1) {
1 j, W! K; ^/ O' M' k% c                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));
* |+ `7 ?, ]: ?, X# ?              }
' p. s1 K1 R2 i- r5 Z$ P               // 4. down + right  }4 E1 ~4 _  o* O% Z
               if (i < grid.length - 1) {
1 {7 k1 F' c+ w, v2 o                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
+ B8 a6 Z2 k' p' K% E, O* j. `              }# @, u, _# ^* V# `. m+ ^0 E( j
               // 不转角
( ~5 I$ e' i( U% [               // 5. up/down/left/right
# _) {) M6 V9 Z; O2 f8 h- v( ^" D& M               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));7 @/ e7 D1 ]5 \7 H/ b  E. k6 H
               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
: Y. }/ A0 A. Z) [               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
; F# g5 U' M, A# |/ M               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
8 J4 j" y; ]6 o: w" g          }8 X1 t$ X+ J* _8 |* U
      }
6 {- |( b8 I1 }  }1 Z       return res;
- W/ r' {' k  o  }
$ Y  \4 r7 H" d0 |" q! L( d! e9 P. g
   private int num(int x, int y) {6 A7 i$ ^" ~# a5 n) e
       int res = 0;
; ?+ z. [. C0 _8 D       while (x % y == 0) {
! C  Y  U+ |! w( C% @9 m9 f0 }- N           res++;
2 i4 W, x+ @+ ~7 g. K           x /= y;
; p+ u6 {+ M9 u      }! ]; d& B5 d6 T/ W7 E- j6 \
       return res;
3 T% |7 h! r2 U: k) j& c. T  }. N$ d+ C5 H( I# Y; t
}
0 Y8 J2 ^/ a+ o) ]" c$ Z1 y6 Y  V8 C
【 NO.4 相邻字符不同的最长路径】
) t# M6 ]* B* f  W$ q# b5 q, U" m! ?& X% Q# a2 X
解题思路
* c( n5 B3 X/ [: n" P. h" R# c求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。4 I+ x3 @0 i! R% v7 E, |
1 t/ J+ n8 O4 `% ~& ]4 a
代码展示
" o( N, _9 {" N
( c. ?: G& V# B, Z( C3 xclass Solution {
8 m# d! \4 d' m  w   int res;
8 W+ G' O% |$ i8 q. }
. j1 ?- U! D+ D   public int longestPath(int[] parent, String s) {+ d' C, w* X6 C+ @. b  t1 Y+ |* K) _
       Map<Integer, List<Integer>> children = new HashMap<>();
- h& ?7 }) Y) E       for (int i = 0; i < parent.length; i++) {
3 Q7 F/ O* N) M/ o1 {3 t1 v           if (parent[i] != -1) {
5 s6 G; G/ f* I7 N" Y* Z9 r. f               if (!children.containsKey(parent[i])) {+ _& ~1 h. O: {, \8 r
                   children.put(parent[i], new ArrayList<>());
  m* u9 i2 K. d# @6 e, Y              }
: M5 e7 ~4 G' Z: M# q, W               children.get(parent[i]).add(i);
3 {% W( @! I! y0 C          }
! S4 r/ d+ E8 p$ p1 `      }
$ n: Y: v; v. Z: Y: o2 S5 q- }' L5 X( v9 b7 X* j; R
       int[] maxLength = new int[parent.length];  {6 k% B) o% d2 w2 l5 L  c+ g# ?
       res = 1;9 {0 i3 ~7 `5 G$ C0 J% w
       dfs(0, children, maxLength, s);# `- Z$ `' {, R+ |8 N7 N
       return res;
( @3 a" X+ J; d, k  }$ o1 P0 `, D' Q

9 e7 a8 v( f. v3 r* c' o2 g9 O& r   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {6 S! b! l% m" K: ?
       maxLength[cur] = 1;# I* D! J. f) o+ m/ V. l
       if (!children.containsKey(cur)) {
0 {% }: y0 V! ]8 j           return;
6 z5 j" e; B$ d9 ^# |      }! A: m0 G9 a+ w) v, }: v
       var curChildren = children.get(cur);( ?; c# w1 Z# X* T0 {' x
       int first = 0, second = 0;4 Y4 l5 T% E0 v4 ^# v& L$ e# @
       for (int child : curChildren) {
  l! ]7 ^, K9 U           dfs(child, children, maxLength, s);5 c. a% Y+ C" w8 N( r: U% }
           if (s.charAt(child) != s.charAt(cur)) {
4 A- o* k9 C( q! z1 h' z, D6 Y. b               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
2 I4 R  I. K/ N' w               if (maxLength[child] >= first) {
( I6 x6 z# ]+ B( |0 V                   second = first;8 a+ `/ S6 ^, w0 d- S/ n
                   first = maxLength[child];& r# H, r, D6 h9 n7 S' g1 T
              } else if (maxLength[child] > second) {
7 b& C  [' e9 P6 ?                   second = maxLength[child];
" {; F1 r' ~5 Q6 Q: L              }
! i9 j3 g* T  q1 f8 v          }9 f) t2 r/ ?, x3 u
      }9 q% r) ], n7 S! d- j2 V
       res = Math.max(res, maxLength[cur]);
) V3 Q% H' e2 n       res = Math.max(res, first + second + 1);1 F$ Y$ s5 b. s; V0 s
  }
. T( w* d( q* G9 k: Z1 T# j}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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