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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】
: O. e5 j4 S7 U) r0 G+ l
2 J# O' l$ k, F" ?, x5 K8 R, Z解题思路
# \- g4 {5 f- D% J0 Q+ X签到题,循环处理即可。
2 e8 V- d1 _% V, t- m) e
% m' [7 _* E3 D2 b& |代码展示* ^$ k; f2 k) p& X: M+ n

- G9 J% S. h5 ?. r0 l" O" N) tclass Solution {
7 D1 L6 w3 |1 y5 U   public String digitSum(String s, int k) {+ W/ \/ k& f; _+ b" M6 p3 e; N
       while (s.length() > k) {
, _- E; V# s0 S8 R) ]& t           StringBuilder builder = new StringBuilder();( Z/ ~; n4 r) D7 i8 d) P
           for (int i = 0; i < s.length(); i += k) {- e4 m: K& A# {: S7 O
               int sum = 0;  V9 ~* `5 ^! d4 ?) h5 p4 y
               for (int j = i; j < i + k && j < s.length(); j++) {8 \) ^+ M, E6 w) e+ Q$ P1 S
                   sum += s.charAt(j) - '0';# s; f+ N: t1 N5 D
              }
7 @. O6 @5 j1 [/ h7 S( D               builder.append(sum);
8 J5 _3 k6 Z, q7 l          }
4 s% n/ }% U1 v* l2 ]: v) s6 x! |. N           s = builder.toString();
5 H7 a) q4 n6 X) |5 C0 q6 j      }
4 e" H8 p" `: O# F! R( L       return s;# m! [2 x* |6 ^" Z3 J  Z7 L
  }+ D+ ~) H6 @0 T* g, G6 y( S3 t. q
}) U/ j, |5 y* A/ N2 \" w" {

1 l  n% Y. K% u3 ^9 }
& Z9 N5 [! ~9 x/ @. Y! M【 NO.2 完成所有任务需要的最少轮数】
0 R# D9 j, L5 }% O
% Y. O; t: V. V' E解题思路5 |; c' T  O2 L% E
使用 Map 维护每种任务的数量,然后使用 dp 求解。4 ]  i5 E8 [% ^4 P

/ U& _$ c; [- v* ^( W3 I/ ydp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
5 C( u; B$ J! f1 N
; U* A6 G0 }; x# q* Z& Q& A代码展示0 m, h4 y( a' U" R: A
$ N& Z+ A6 D: C) d
class Solution {, N( G, A1 p$ J5 c' y; f+ E
   public int minimumRounds(int[] tasks) {
$ |/ g* l) \6 ?$ X6 g       Map<Integer, Integer> count = new HashMap<>();, h& g4 ?& O4 E/ B
       for (int task : tasks) {8 \' w0 b, z0 c/ g' W( P# _4 p1 c. ^
           count.put(task, count.getOrDefault(task, 0) + 1);
+ Y3 |8 ?7 N' q) o      }3 p, S. i+ w6 g4 H) d
       int res = 0;2 m/ ?# k9 P5 V$ \2 C' y  V) s
       int[] mem = new int[100001];2 W9 u. L3 B2 S/ Y
       mem[2] = mem[3] = 1;
& B( x: ^; ?3 o       mem[4] = mem[5] = 2;
4 {  |: Z) s" `" q$ f- f       for (var entry : count.entrySet()) {. h6 H- Z6 ?# ?/ ?. S
           int cnt = entry.getValue();
4 x; L- I, p/ o' q4 ^1 I* \/ h           if (cnt == 1) {
8 o2 W$ m6 B$ o) J: b               return -1;4 F/ r" o+ p" f$ Q
          }
  N, w. a' ~1 Z" ^6 A9 N+ t0 c           res += dp(cnt, mem);. p3 p# z1 g2 V1 W: `+ a  O# c
      }. ]) I% I3 s7 s7 _1 C
       return res;9 E! w! _! U* |0 f% L4 P' t$ C
  }; ^4 @% J/ O" o! S7 c4 U
: X1 g4 P! F9 j
   private int dp(int cnt, int[] mem) {
( l& ?. [# N1 O8 W* y       if (mem[cnt] > 0) {
" w2 f1 _1 X8 j8 i1 {7 C           return mem[cnt];9 N$ w" w8 m' h0 a$ X; H% {
      }
& M3 T0 Q: \( A, `/ F4 J: J       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
& Q; X7 r/ F2 b- @; X$ @       return mem[cnt];
# {  _  n  }$ f/ Y  }
; L8 |( J  q  E3 \}9 `1 {& h4 w2 r6 O0 v$ c$ m
$ c& |" [% }3 ?+ T0 W
0 S& n8 t1 h8 g: {2 R7 T
【 NO.3 转角路径的乘积中最多能有几个尾随零】
" v! d, {/ L$ l3 A  x7 b) f
2 |3 x2 J7 b8 ~4 z! v/ L& y4 A解题思路
0 y7 _& ?2 s$ U' j+ U尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)! p% `3 Y# i+ e3 S# ^( _

! v8 p- g$ O8 X1 `+ V3 S% y代码虽然很长,但大部分是重复的逻辑,详见注释。, a4 a. h/ l5 d$ J% w: S1 \# t
4 A3 ?, i: e% v' o& M
代码展示$ l( ~# |3 ^; A( u! s5 Y7 y

/ Y) e( f8 {, k5 n& N, [' _class Solution {3 A+ r- Y6 g$ J) @( j, t
   public int maxTrailingZeros(int[][] grid) {
5 q7 k; p1 s; W" E& L$ T* y8 T       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
+ _0 m' E, t( t2 Y1 Q& d( e       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数
" o0 N: B. Z$ d! \; C2 a       int[][] up2 = new int[grid.length][grid[0].length];
$ a" i5 k; f8 W% T$ y$ Z  a       int[][] up5 = new int[grid.length][grid[0].length];
* r2 `9 T6 ^- r3 `  A0 g1 [       for (int i = 0; i < grid.length; i++) {; s/ B2 E# t; [
           for (int j = 0; j < grid[0].length; j++) {
7 f' k( O3 A- o5 p  X0 |. s0 o               up2[i][j] = num(grid[i][j], 2);
6 Y2 j, n4 f. l               up5[i][j] = num(grid[i][j], 5);
. `6 X2 R) M8 [5 ~( ^               if (i > 0) {* ?; R" a. d& m% `+ h. W
                   up2[i][j] += up2[i - 1][j];0 Y2 [  l! G& K" I
                   up5[i][j] += up5[i - 1][j];  s) d9 v% a0 G! K9 j6 G0 g/ P
              }3 A; Y5 J. e; V  V- h
          }; F! Q% d: u5 T. G
      }% {9 q1 k+ s" f# ?! [; t. H
       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数
/ Q; U& g+ s7 p( k, v       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
! R8 ^" x; i, [$ Q$ s" v       int[][] left2 = new int[grid.length][grid[0].length];
) x: X2 D  B: A( p1 X( V       int[][] left5 = new int[grid.length][grid[0].length];
! l; z& T; }, ~  |       for (int i = 0; i < grid.length; i++) {1 T" D0 u6 y& z' \" z
           for (int j = 0; j < grid[0].length; j++) {
3 G* L0 F$ ~9 z+ G7 N9 i               left2[i][j] = num(grid[i][j], 2);
! E5 b$ d  ^# F5 x& ~% u1 I               left5[i][j] = num(grid[i][j], 5);( w/ l+ H( @1 I9 W
               if (j > 0) {) s5 ~3 A& O) {8 p: S
                   left2[i][j] += left2[i][j - 1];
7 ?. l; [' a7 D  V6 w                   left5[i][j] += left5[i][j - 1];( r- L7 t) w$ z/ Z. J
              }
  O' J/ {- I, R4 o& h          }
. v$ r0 k; g+ D# \6 j9 K      }
% C$ ]/ ^+ A( y: Q8 A: e9 H# r       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数' |  `; Q: ^# L5 y, X; @
       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
2 z* K; \% S- i+ }" N/ L8 ^1 b       int[][] down2 = new int[grid.length][grid[0].length];
7 q$ w- h! d5 [7 x7 k7 C% B       int[][] down5 = new int[grid.length][grid[0].length];4 Q+ G0 K$ A; d$ E* L; [
       for (int i = grid.length - 1; i >= 0; i--) {" a. {6 `, `0 }8 O4 V# `. d% Z
           for (int j = grid[0].length - 1; j >= 0; j--) {
& n+ i6 U9 c; a               down2[i][j] = num(grid[i][j], 2);
, a2 a" x; f8 \7 V               down5[i][j] = num(grid[i][j], 5);  b% U0 g5 E  j; M& M
               if (i < grid.length - 1) {
  }* P/ _3 L0 G7 a+ V& A5 C) R                   down2[i][j] += down2[i + 1][j];
# k: e/ \0 c' ?4 ~5 q# O                   down5[i][j] += down5[i + 1][j];
3 V; s. b# _( u5 s& r0 o              }, D* r+ ]+ t( d& A  o
          }1 @" }3 n/ Z9 O
      }& J- x' z, M9 I+ m0 w3 ]
       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数( m- s5 O) x: w
       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数
. H$ O4 w. T/ I' s       int[][] right2 = new int[grid.length][grid[0].length];
  q( [* [' B* ~" x; ~; V       int[][] right5 = new int[grid.length][grid[0].length];
8 l. m. [/ h/ B$ ?8 Y5 c       for (int i = grid.length - 1; i >= 0; i--) {" c. U: a- W2 o
           for (int j = grid[0].length - 1; j >= 0; j--) {
+ T5 [3 E5 {+ r, _" f               right2[i][j] = num(grid[i][j], 2);
9 }+ D. P9 W. t* m& P               right5[i][j] = num(grid[i][j], 5);5 W- S6 k4 Q+ F- i" v: C$ i7 R
               if (j < grid[0].length - 1) {
3 J6 R4 S. M) v7 \- T2 r% z. [                   right2[i][j] += right2[i][j + 1];
3 k! \* Q; o6 [7 S/ X- @                   right5[i][j] += right5[i][j + 1];: N: C5 T. v" F0 ]9 U/ J9 [8 e
              }
( v1 i5 s3 D8 M# _* d5 \  Y          }6 {0 _0 U2 h- J0 m3 y
      }! n0 w: Y+ H8 i2 I2 ^8 o5 `

: e! Y( c, d- \. j# g& b- G       int res = 0;- D& S( V- T7 I% p3 f1 i
       for (int i = 0; i < grid.length; i++) {, e9 O3 U' I2 \+ [7 d0 @
           for (int j = 0; j < grid[0].length; j++) {
2 }* t# ]0 }" S6 D0 _* T               // 有四种转角形态
7 V" o+ r. K- c+ d" B  Z               // 1. up + left- |, S7 L/ r7 B% p1 p. H4 n9 w" ?& Q& o
               if (i > 0) {* }9 _; P) l$ O! S) N
                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));9 ?: u, H$ E' E- ~% E
              }
- c0 S$ @& ]6 e               // 2. up + right: B6 Q3 t2 _$ E
               if (i > 0) {& E4 g4 c* [5 |4 p/ ^
                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));
/ F+ \  Z" l( A6 N' V1 q              }; T( ~0 _8 D3 y8 ^" V
               // 3. down + left6 c8 T0 l0 f5 \  t) J* ~1 X
               if (i < grid.length - 1) {
9 y9 k+ |3 R8 [" w0 D0 b                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));' l! W1 G' T) Z5 s. M5 d( }
              }
/ w. O5 u; i8 @/ P; b  x. r  I1 b2 N               // 4. down + right
8 T* Q) }: m7 L               if (i < grid.length - 1) {1 x- V. h, T& z& u* X. h5 O
                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
' n; C5 H  K1 }6 }2 R9 h              }
1 {, o# `+ D- P) L$ o               // 不转角
. E& e; n3 }$ X               // 5. up/down/left/right; w' u, a) U1 I
               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));. |8 q& f( ]: G1 Q# o3 X- K3 L
               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
- x9 ]  `4 `) i- C               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
! z/ Q% B; c# E5 ?5 I% i9 o               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));0 E6 w9 B* A1 S4 E/ B# o
          }
5 T4 K/ d) n7 b( G) a      }: ?' j8 l+ k; }7 {% n) Y# y
       return res;: ^5 w0 V' @8 [6 W
  }
/ q1 ^+ o" M9 B/ v8 s  h; o0 ?8 Z" g: `0 a+ M2 s1 Q* |
   private int num(int x, int y) {
) g8 j9 j, ~% @% S( v& S* `9 i       int res = 0;
( v! f4 i  K6 Z8 b. w       while (x % y == 0) {
8 ]. I' V0 t7 j, R           res++;
7 J+ Z" T( S8 _7 p* C           x /= y;
: ]8 E: O% ~' u, q      }
( v) d9 V! [8 ^       return res;4 u, p7 Z4 d' b, ~
  }
) e2 R( h( U6 w}8 S3 j# t- C1 W$ R

3 ]* c9 H- G5 M9 {* w3 E. x【 NO.4 相邻字符不同的最长路径】
. ~0 \* ]& t" {0 O" c3 M+ W2 C( n4 z0 y; y3 d
解题思路( I& q7 z7 ]8 h3 M: v4 A; k5 I0 u
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。* s( _: g) o# j9 u2 }2 v* a8 m; O

5 i; ]& [5 J+ Y8 ^9 o5 Q0 o, ?代码展示+ K7 X" q. C) S! w1 r5 o- t
2 R- Y( b) z7 w
class Solution {
  Q8 H3 K2 V) M  K/ M" \+ c1 _   int res;
8 P2 _6 e) `1 g
2 a+ I- q+ ~# a   public int longestPath(int[] parent, String s) {( f1 [# ?% d8 B4 }1 U) T9 Q
       Map<Integer, List<Integer>> children = new HashMap<>();1 s: g' ]0 ?+ {8 V
       for (int i = 0; i < parent.length; i++) {
, b+ ]  T/ T( U, }5 K  {           if (parent[i] != -1) {
4 n& ]; s' N/ Y1 P& |5 c" B               if (!children.containsKey(parent[i])) {( s0 c! ?! D9 g4 a" o( E
                   children.put(parent[i], new ArrayList<>());
2 t3 a3 _  \2 H* ^5 }3 Z! I              }
9 Q! v8 @% x. D               children.get(parent[i]).add(i);2 `  L$ T8 \/ T1 E+ k% ?; B
          }
1 _. d7 [) u* R# s( c$ D      }
. _$ U/ t& A3 X7 {0 u7 n- r5 k
( n9 \/ |. o& n( x5 B       int[] maxLength = new int[parent.length];* u* P0 T) y- v
       res = 1;
2 G0 j# m; s% B- C) b       dfs(0, children, maxLength, s);
, W$ z; V  O7 \- w. M( x) @0 b' {       return res;
( F2 Y5 N8 e  P& ^; Z  }
0 Q; @" c8 I& n0 W$ f( O; @
% s# c6 I+ P* I1 [1 R   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {1 O9 y% Y, g0 i3 F* z
       maxLength[cur] = 1;, j( d3 h4 _3 }* g
       if (!children.containsKey(cur)) {
, g& u0 Y+ y0 m6 y% o           return;7 w* ~- R+ _, P/ W" B% b
      }3 j8 O3 K; g$ `% A1 X& z
       var curChildren = children.get(cur);
) J* M3 ^  y; ]. L9 i9 u       int first = 0, second = 0;
) L2 `/ _5 }" i# D! F2 s3 ?       for (int child : curChildren) {3 f, B) `! e% U  ~/ F; Z
           dfs(child, children, maxLength, s);
& Z. D0 m$ g" }5 D           if (s.charAt(child) != s.charAt(cur)) {3 ]6 U8 v* g6 m) e* Q0 g
               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
. t8 `1 B4 P1 a: Q7 K               if (maxLength[child] >= first) {
* u: G$ O4 E) ~9 a9 M& G+ z                   second = first;8 r- N1 P7 A# C. }- M, Y  e8 K
                   first = maxLength[child];- |* v: l6 b5 ?+ O
              } else if (maxLength[child] > second) {
& }. X' A$ H# r" h. M6 b                   second = maxLength[child];5 ~5 y) A  h# H* G" t: j* \
              }4 l; Y- s6 Q2 Q2 O% y/ y
          }
$ K5 z% Q+ t0 H3 O) ~) F/ ?8 {      }# c& k' M: p% M6 m8 J( _  n
       res = Math.max(res, maxLength[cur]);
$ |- S- t. v; d( P$ u       res = Math.max(res, first + second + 1);- Y7 N- u" z1 b  H- Q
  }+ E: D) V# O' x; K/ y4 v
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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