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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】
( {7 m3 [  }( |( N, f+ k8 l* {; o! v% _
解题思路" x$ z* \* S2 D  X* t" e
签到题,循环处理即可。
) J( }* N% [+ y( V2 j- X( W4 o) v  J2 Z: w* t
代码展示! a$ S# E5 P1 H+ Y7 v" U
% i: Q+ {2 Z( Z1 B+ x$ e
class Solution {, d4 W& T7 c1 r! I" I/ i
   public String digitSum(String s, int k) {
6 ~. u' W1 i6 O+ [       while (s.length() > k) {% n6 b8 @$ i4 W; `7 O' l8 A$ W. w4 u
           StringBuilder builder = new StringBuilder();
4 f  x# D. [/ t" ~* D( q) ?           for (int i = 0; i < s.length(); i += k) {2 D9 `* ]/ w3 D: {7 J
               int sum = 0;% a7 Y; O8 {) w: y' u+ h, Q7 @
               for (int j = i; j < i + k && j < s.length(); j++) {
9 C8 y1 D: `0 \3 o2 E                   sum += s.charAt(j) - '0';$ J. f, u7 M* F- g2 B& W- S
              }
$ m) @/ b+ k' d               builder.append(sum);7 u; m2 O/ I4 `1 c0 U
          }% v% g7 d' I  ?/ }
           s = builder.toString();6 }2 s  J4 Y1 B, u2 V
      }
$ m3 `, g- P  h7 o# h: x8 ?2 \       return s;
6 k# h& U: b; w& k. V7 G  ~  }
& V2 \, s" R0 C& Z1 W}
$ d/ l/ h4 @0 }/ E3 s' _4 q" j3 B+ V  `6 Y6 V& G: |

! S& V  ^; P6 b【 NO.2 完成所有任务需要的最少轮数】. t& d7 Q+ t- Q: K! Q

6 V, x- e. I8 L) V/ \解题思路
# M7 _% X5 d: i8 o' h- H9 c6 q' W7 C使用 Map 维护每种任务的数量,然后使用 dp 求解。/ f/ a* `+ l$ v% ^

3 v1 X" _' o( Z2 t0 D6 A* z  edp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
$ P1 _0 t$ }  U% \$ [7 m
6 }( d+ T/ N- ?2 ]- o代码展示( _$ ]0 N: e3 D* C, i
3 S+ l. o3 k% a" I" P
class Solution {
4 B% w6 z6 Z9 c   public int minimumRounds(int[] tasks) {  Q* N0 I# ^1 D/ E: X4 x& N
       Map<Integer, Integer> count = new HashMap<>();+ g* s# l' y$ o
       for (int task : tasks) {' h3 m0 [7 `) T7 }* {7 x9 f9 L
           count.put(task, count.getOrDefault(task, 0) + 1);% O4 S3 P; z: t8 R
      }" \8 F. I7 e! y1 E* v; s
       int res = 0;
3 w; e+ I' N0 ?. c       int[] mem = new int[100001];' ?8 \+ G( Y, {9 }" p, d# g/ j: {5 O
       mem[2] = mem[3] = 1;
3 Z0 e9 g% A* p1 k- @  e6 ]2 p0 H       mem[4] = mem[5] = 2;1 j/ t, {# _6 S3 `. H! t
       for (var entry : count.entrySet()) {" z8 A( p0 m) M' `" Y
           int cnt = entry.getValue();# z4 N/ h+ A! E4 V8 ~& u, l# c  k
           if (cnt == 1) {$ G# g: c! s# B9 L3 ~
               return -1;
2 n8 F& D# V3 j2 A          }
+ ?! S0 ~6 A/ o3 I           res += dp(cnt, mem);
5 P) {5 r) `2 x! a+ Z      }) G8 n* |, p; i4 \3 t4 r- B. Y
       return res;/ S: y5 t* F/ j7 t) F5 ]# j  X
  }) M5 ~3 ?" P1 y6 j' {$ _
) J. E- L" r: |# k/ v
   private int dp(int cnt, int[] mem) {6 H9 I8 v5 M; n( N+ @' u  |; ]. _
       if (mem[cnt] > 0) {
* a6 t# B" w9 f           return mem[cnt];
2 a  {8 |8 V+ M: P. H      }! z: C) p& T  }7 Q/ ]
       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
5 j8 T$ s4 y2 O       return mem[cnt];8 q- |  F# r5 t6 `5 B. b
  }/ y. y$ U0 _" \2 G" Y
}( Z: [# q6 K" I) W; o4 H6 p5 p( \
% X( w6 c% m& x0 ?$ g

: E8 k; j5 U9 G1 H/ A+ ]& m6 R* }【 NO.3 转角路径的乘积中最多能有几个尾随零】( f6 l8 q4 w- V$ r8 z

6 c+ C: V9 K5 d' w6 e& ]解题思路- E* ?3 _+ K1 b# N
尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)
% @9 o) ~: ]% m6 \% |0 G4 f. o7 R% g3 v1 u" g) z
代码虽然很长,但大部分是重复的逻辑,详见注释。1 s' p7 u4 e8 E" s5 u& c: [

# I* B0 I3 f3 ]0 x- c" c代码展示
- [. m% O, N) K: P6 E1 X- R5 `. B" P1 J/ i7 H9 B, T+ i* }
class Solution {
: x5 B! q4 i- f  a: U" W   public int maxTrailingZeros(int[][] grid) {) s: i7 Y" v3 ?8 h$ t2 W( R
       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数+ v6 _2 y# T& P2 O* U
       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数" h2 }( P. v  a# o6 w; C
       int[][] up2 = new int[grid.length][grid[0].length];7 r8 G5 }3 k$ x! F. G3 K  `7 J% [
       int[][] up5 = new int[grid.length][grid[0].length];
  |0 n: Y( v; n$ ?       for (int i = 0; i < grid.length; i++) {  H5 _/ H) b' H; Q
           for (int j = 0; j < grid[0].length; j++) {# {% Z0 p( D! s' M
               up2[i][j] = num(grid[i][j], 2);8 L  V$ [/ E7 q
               up5[i][j] = num(grid[i][j], 5);
8 Z" J: H3 P6 y7 o5 U* \3 Z2 i               if (i > 0) {
& w. S6 A! `7 s; @, F4 ]                   up2[i][j] += up2[i - 1][j];
" S( f( z% b; F( t: \                   up5[i][j] += up5[i - 1][j];# f0 a+ O# E* P: w8 c( k! Z( k$ O
              }
; g0 B3 o. M5 F" F& r& ?: I6 ?          }! b/ _& ?; T, |5 H# ^, y
      }5 b* _5 r) D* n* S1 ^! y: e' \9 h1 F
       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数
: |* R/ S. R$ ]/ p. j6 C1 o! u       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
/ F( n& v/ V* E3 _6 ^2 M- L       int[][] left2 = new int[grid.length][grid[0].length];* I  u  O2 q2 P% V9 q
       int[][] left5 = new int[grid.length][grid[0].length];# g" W! e% C& z0 z/ b* }% h
       for (int i = 0; i < grid.length; i++) {
' {$ d' `; m# w* C           for (int j = 0; j < grid[0].length; j++) {
0 w/ l6 \6 @! R' f& ~: _               left2[i][j] = num(grid[i][j], 2);* }  h. Y  D* Q) b% D6 H
               left5[i][j] = num(grid[i][j], 5);
* Y4 Q1 e0 q1 X& n7 k( r. \               if (j > 0) {
! `. h) D. D( X, w2 e& e  N# ^0 M                   left2[i][j] += left2[i][j - 1];
7 ^$ b" N9 H9 G( f5 }* v                   left5[i][j] += left5[i][j - 1];
" i- M1 |2 K# u. M/ }              }
2 m$ ^+ T* Y# F' e# ^3 a          }
7 W% S( |& F! i8 e      }
/ i. O. L- {, B       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数1 V0 t3 a% m* @
       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
+ F8 r: U; W5 S       int[][] down2 = new int[grid.length][grid[0].length];5 z8 B  x1 T( M" v: _/ D
       int[][] down5 = new int[grid.length][grid[0].length];. k+ j4 K3 J: |: U1 }* v
       for (int i = grid.length - 1; i >= 0; i--) {7 \. V8 a9 ?* E2 z, ?# U
           for (int j = grid[0].length - 1; j >= 0; j--) {# _$ [% ^. T/ \  ~
               down2[i][j] = num(grid[i][j], 2);8 h. {) o3 A4 n0 r
               down5[i][j] = num(grid[i][j], 5);
' S& y0 P0 E7 ~' B               if (i < grid.length - 1) {
7 e% m$ G* z- {6 j$ b                   down2[i][j] += down2[i + 1][j];3 N% Y1 R7 [: {  i
                   down5[i][j] += down5[i + 1][j];
( e" c9 E0 s, V, b! z8 n0 k              }! @' ~) R3 g! K2 p3 e6 \
          }' F6 B# }& d, A* }1 Y4 Z
      }
: R" o* f% j- s2 M. V, H) {       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数
. P/ X. _& x3 y       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数
1 l0 V: j8 d* l  l# n( a       int[][] right2 = new int[grid.length][grid[0].length];, q1 o7 Q2 I& I. U: Q
       int[][] right5 = new int[grid.length][grid[0].length];
) |4 H7 C8 W. ~- p0 d+ E       for (int i = grid.length - 1; i >= 0; i--) {
& f# ?, x2 k8 \3 c( ]           for (int j = grid[0].length - 1; j >= 0; j--) {
% _/ \+ p( H; P' L! B               right2[i][j] = num(grid[i][j], 2);  S2 R) Y; n5 t, z
               right5[i][j] = num(grid[i][j], 5);& x0 {4 x+ l, o9 ^3 a
               if (j < grid[0].length - 1) {
% \+ a$ ~4 |9 p  ?" }# y8 j5 v                   right2[i][j] += right2[i][j + 1];
5 q, z: ?/ v, J                   right5[i][j] += right5[i][j + 1];
' U5 e( S& Z3 G, P              }1 c( Q0 g4 s8 }. x; @
          }
# o, W' T' l* |5 \4 |2 C* k      }+ I% s/ Z. o& H' @3 k
6 \8 n* |$ ^% p1 @: C. L, C
       int res = 0;
) A: Z7 U! X" \. C: N$ {8 H       for (int i = 0; i < grid.length; i++) {
9 ]+ j* N  ^' ^0 ]" I6 a           for (int j = 0; j < grid[0].length; j++) {
# e) _: `9 C  w( R               // 有四种转角形态
- ~, q, x$ C( B               // 1. up + left; n7 r* O, _1 r2 F; I
               if (i > 0) {! q1 C0 t0 Q' L, K
                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
# }# u3 S! r" @. F- o; Y              }
, R0 x+ S0 v( S0 S2 s6 o& r) z               // 2. up + right
& l7 N5 O: C! I; G7 t0 g  I" u               if (i > 0) {
# }! f3 k1 q4 i. }  j( d                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));* e$ c' V9 B! Y
              }: E% Z1 c) W' `- Y- c  s& n' \3 r6 t
               // 3. down + left' F+ A7 X. r5 p0 e1 q# b
               if (i < grid.length - 1) {7 q* B' c6 [$ V" B
                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));
4 _  A; B) F; x# P3 e/ L$ \              }
- Y- d- m# B& Y* B" p' T4 ^! W; f: r               // 4. down + right
0 ~- N0 L/ j( H5 e- y5 R) q! ~               if (i < grid.length - 1) {8 u0 t1 n$ Q. O5 L$ I9 m
                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));9 ~# ^( W, Z4 O5 z
              }: D& f$ u- O" p( K" ^9 f
               // 不转角7 K) X- r! z+ v9 u; E
               // 5. up/down/left/right3 s4 R7 f6 A" s5 ~. l
               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));! w- W7 O+ v$ Z2 C9 M  `0 [: A* I' t: A
               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));( M; Q) t. @+ w( K+ L/ `3 y
               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
$ J9 D+ m5 k4 Z1 Y1 S7 j               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
7 m. ]+ f  V* R* R8 n; K          }# ]  z0 Q/ V5 m* y) k) O6 T
      }
+ R/ ~  }3 H* {       return res;
! E! ], i8 n4 E7 c6 j' t# h  }# E: X! Z8 e- G/ F
1 `" n  M- Z4 k
   private int num(int x, int y) {
: x0 c2 K& p( `       int res = 0;
5 m8 @, f  x! Y8 Q. g8 a/ q       while (x % y == 0) {0 C! ^) y! a3 Z, v+ @
           res++;8 \2 R6 ]+ d4 l# n
           x /= y;# d8 v7 c7 ?- ^4 N& b
      }
9 m2 G0 w% y# ~# [: n8 p% V       return res;6 @) t/ q- E" x" K% E- ~( p0 D2 E
  }' g% Y2 H2 B) M; t7 c
}
$ \/ Q( k6 {& ?' t- _3 g  O& ]3 Y: o2 i
【 NO.4 相邻字符不同的最长路径】
6 l# ~5 ~& o( f3 ^, N+ I
  x9 m$ B/ R/ q/ q; p. E& a7 x解题思路
0 i( v! r' D4 k# v7 U% `8 u求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。$ V" }4 y( E$ Q, @( N* l
1 J1 u* f. z9 I# u( }4 H
代码展示- t- v9 t$ T- i9 K/ r) }% W& P. g

7 Z0 \' H* t+ U9 z3 R, r7 N, yclass Solution {
, i* D6 j. Y+ ?4 r4 d; V2 X   int res;' h, ~6 i5 A# I6 c7 s  E# }

# H) \; e0 I: I/ S3 ^+ x   public int longestPath(int[] parent, String s) {  o0 B8 x- f: B
       Map<Integer, List<Integer>> children = new HashMap<>();0 v8 e* M% P! w* Q5 C4 M4 G
       for (int i = 0; i < parent.length; i++) {
% X) q4 \* M9 ]& ^9 G           if (parent[i] != -1) {) @: Z  V( ?0 `
               if (!children.containsKey(parent[i])) {$ u* D0 b/ L2 y# G7 O- k( Y
                   children.put(parent[i], new ArrayList<>());
3 W- j( ?: {1 Y6 K! z- x. i% f              }7 h. x3 @, W: a7 W
               children.get(parent[i]).add(i);" r; n8 C8 z' v5 t" V' o! o
          }* z7 w7 n" Y! }# V) E
      }7 ~3 W6 t- r0 R# u

0 I- q; z' m, r3 p, k# }$ U       int[] maxLength = new int[parent.length];
; |+ |8 J" d" I! J. }, J       res = 1;" r. {5 J: @7 h% }" u
       dfs(0, children, maxLength, s);
  C0 d) t7 b6 T/ O$ `       return res;* C0 x/ U* Q0 f- i$ B. ?/ j5 b7 p/ {
  }% ]# w& o9 ~: S2 Q6 B1 W& D$ L
; ^7 n( ~* I: q7 |3 {, q; O5 I
   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {8 j0 F, U" d& x
       maxLength[cur] = 1;
6 ]7 D- D7 n: v  j3 _. M       if (!children.containsKey(cur)) {# C! `" V/ Y8 E3 n( g8 [
           return;
/ v+ d  \0 ?- S: N; S      }
9 M" \) {$ v& O% z& W& Q       var curChildren = children.get(cur);
( l  m7 x) M' U7 S       int first = 0, second = 0;* d1 o* M$ P2 J' w
       for (int child : curChildren) {# H; [+ i! p; g! W, B# k- W. w
           dfs(child, children, maxLength, s);) S8 ~4 l: n6 l0 y3 }: H- Y0 a+ z9 }8 L2 U
           if (s.charAt(child) != s.charAt(cur)) {  W6 m! ^. l+ P5 R& B& Q
               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);  l' v6 S8 G$ E4 a4 [. M
               if (maxLength[child] >= first) {3 Y: L3 n) V8 n, M
                   second = first;4 U; s1 R" Q7 W4 b6 M" `- o  d
                   first = maxLength[child];1 ~) r% t$ z4 t' O8 t* k  P
              } else if (maxLength[child] > second) {/ _% @  r' u/ J/ H( L6 F; g
                   second = maxLength[child];# H" g/ h5 S  i1 r3 g
              }
, o: I2 q; C: @          }8 e$ j# J6 d- O/ m
      }
! \% Z; [' T" ]( P3 p$ T3 j       res = Math.max(res, maxLength[cur]);
, i4 N6 G* F0 k% R, z- l$ j7 u       res = Math.max(res, first + second + 1);" F- T( a. h4 {
  }# `3 l/ z& p" l: i0 D
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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