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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】. h* P  }+ l$ `, `5 l
6 @  b0 v: B6 f2 t! Y: o
解题思路2 W" ]5 ]6 x; B
签到题,循环处理即可。
3 ?1 v2 [! m9 |+ W4 A" ~: ^- Q# r* C7 C% n+ ~& l! V
代码展示
. S  g+ H# C- G$ T6 E- y/ s
$ f! i8 [( P# \% R' lclass Solution {
4 G6 A( s& o1 Q; {# U   public String digitSum(String s, int k) {. P5 W. U8 g9 w% |
       while (s.length() > k) {
2 h* D# E7 n; ~* _  K" M$ `           StringBuilder builder = new StringBuilder();
" o& y$ L) E, ?% X% c( S3 A           for (int i = 0; i < s.length(); i += k) {0 Y+ s, N1 M/ l- B9 t4 l' f
               int sum = 0;
$ o. z9 Q: h: H: Z: d! K               for (int j = i; j < i + k && j < s.length(); j++) {
2 O# s5 P5 ]: f) I; Z9 b4 Q$ n0 t                   sum += s.charAt(j) - '0';
! _: q, P" K+ U6 O4 {              }
! h( W* j% x" x               builder.append(sum);
$ _# @# [* a' p% y$ b3 t          }
( O* E/ j! ~4 w/ @  E5 S. W           s = builder.toString();
0 `5 Q& E! {; d8 _1 C      }
  k" M5 H3 W: n; h, T, \4 s       return s;
6 R/ {8 C- ]3 o- [( g  }5 ]4 m& M+ X. B* x, k
}% h$ G: w) Y+ V$ M

( ]$ p4 i  n! p4 r
7 n0 f4 ~! O  U1 j# `/ I【 NO.2 完成所有任务需要的最少轮数】& ~* W' z/ j& ~, \/ G/ S

7 F  Q1 h  s& j解题思路' P8 }  M9 y/ O: l* g; [
使用 Map 维护每种任务的数量,然后使用 dp 求解。
9 x! ]( }1 ^( y) j5 u! h6 ]: y+ N
1 K$ H% E, Z& l2 }& W5 G* x7 ?dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。: W. U/ A( `% S( J( ], c
, s8 i/ p& L# g0 }. W1 D
代码展示
6 t6 J; d: R+ M: a4 J3 y2 o, K  ~1 D5 S( i3 y5 T& S" O$ _
class Solution {
7 ^5 G: t6 x2 P1 m" z! ^- ?   public int minimumRounds(int[] tasks) {/ K. a+ z1 E3 b) C
       Map<Integer, Integer> count = new HashMap<>();
, Y8 I( }* r# M) F+ |       for (int task : tasks) {
7 g# m; z" v  H, M3 q           count.put(task, count.getOrDefault(task, 0) + 1);1 m- p+ n# i; T- `1 x% M. l
      }" R1 K2 |* E) Z+ N# `! d2 p# P, D
       int res = 0;  c$ t% G' T* Q; T# E" d! H; r7 W( |
       int[] mem = new int[100001];
+ ]6 \* V2 O- B  `1 l       mem[2] = mem[3] = 1;: T5 }. {9 W; E! a5 A1 n7 B, S
       mem[4] = mem[5] = 2;1 }: g( \. @- b5 L3 u9 l; p
       for (var entry : count.entrySet()) {! V9 T7 y) T: d: N% C% a
           int cnt = entry.getValue();7 I5 G6 r% e/ P' s9 m
           if (cnt == 1) {, G2 e6 }8 q, m' Z
               return -1;
6 L- g( S  K) v( g; D. }          }
4 z+ b9 Q. c% l- |' H           res += dp(cnt, mem);
7 ]; ]' |9 g( X0 O' n3 h      }
2 N% G" H5 D+ }  i       return res;, D- ^$ Z& f: l6 Y. Q
  }
/ e# B6 w/ G9 {+ n& m8 u  ?
; p6 |) e2 i5 s9 r7 L3 ^$ x+ V   private int dp(int cnt, int[] mem) {
* s# d! ]! A' L. T       if (mem[cnt] > 0) {
( L' S8 s0 c+ d9 f           return mem[cnt];
3 L. t: ^9 _4 L# n4 P) @6 F$ d      }
  z+ y0 z& S4 P       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);! O* z" ?5 F8 |
       return mem[cnt];. n& k. P  q0 h; M- q8 h
  }* q; s9 ]+ Q- c, c8 |
}
* R3 p7 t6 q) I+ p1 U7 f" q. J$ K2 e- o: g4 J0 O/ [# a, p2 [8 {
6 T+ F1 }( z" O- C1 \
【 NO.3 转角路径的乘积中最多能有几个尾随零】1 N6 M  Y. g; T
5 L8 O2 m( Y$ e( s" ~. b
解题思路5 E8 ^5 V5 s/ H1 u; P
尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数): Z" F  |+ w+ D  Y

+ D0 i$ O9 f& t( R/ c8 g  ~代码虽然很长,但大部分是重复的逻辑,详见注释。
9 r! h+ h% `4 [5 d9 N8 d
# @# ~2 H! m2 U, F% K代码展示. T- _* ?6 A9 H

+ [- V, T( `2 f1 N9 f# ^  i' Y" _class Solution {0 P5 g; j2 F9 u' W4 r- W" ?
   public int maxTrailingZeros(int[][] grid) {
- h+ q( B" E) K1 v       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
1 z/ B9 q) U- j# ?& j. q       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数
4 ?8 k. W. I5 E  `0 Z/ y       int[][] up2 = new int[grid.length][grid[0].length];7 g: L( r5 F& }5 ~7 b
       int[][] up5 = new int[grid.length][grid[0].length];0 V+ G; u% t; L
       for (int i = 0; i < grid.length; i++) {7 @3 {% s) d" C; G
           for (int j = 0; j < grid[0].length; j++) {
( f6 x4 k3 ^: _! K3 Z- O; T               up2[i][j] = num(grid[i][j], 2);
# R" p% o9 m* t% E- d9 a5 z               up5[i][j] = num(grid[i][j], 5);
% p; t4 Y: R% @: u  p$ f               if (i > 0) {. g7 Y5 i( r1 `
                   up2[i][j] += up2[i - 1][j];3 b* k+ e: m5 x& Q
                   up5[i][j] += up5[i - 1][j];3 c5 G# x3 @' |
              }
& ]4 I# I& D" u! J) Q          }
2 r' P' \4 d! S  v" }9 ?* F      }; _3 U( G+ s% s9 I* e& ?: e1 \
       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数
) T0 O2 H! a/ R2 i( _+ o9 p" Z' {       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数$ n+ [% s" R# D8 [& b
       int[][] left2 = new int[grid.length][grid[0].length];" L$ v) m( j, h2 p( s' g+ U
       int[][] left5 = new int[grid.length][grid[0].length];
2 `' W" Q" B5 D7 x4 z       for (int i = 0; i < grid.length; i++) {4 o5 a; M: R+ T0 o9 |- K
           for (int j = 0; j < grid[0].length; j++) {
3 o5 j9 \, g6 r& c7 m               left2[i][j] = num(grid[i][j], 2);; \% l8 H, K- Z/ p; ?. Q7 ~* ^8 p. R' q
               left5[i][j] = num(grid[i][j], 5);
( f9 u! L: x: b. v# n               if (j > 0) {
$ }# c1 ?# V7 ?0 z$ K( X                   left2[i][j] += left2[i][j - 1];
' r. I" K0 ]5 U+ Q" `$ _                   left5[i][j] += left5[i][j - 1];
6 t" Y3 e$ r! ?7 D4 \$ O              }5 z7 b& ]9 T  O# j; F; [5 |5 T
          }8 u, |( m6 B* t2 w1 C5 c3 @8 w# g
      }0 `+ r1 z% |- k8 ]- b3 a
       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数4 P. Q2 A7 {$ Q9 L
       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
) h+ c6 R9 V$ h# r: L       int[][] down2 = new int[grid.length][grid[0].length];  d, b- G" Z) H% T& q6 e" E
       int[][] down5 = new int[grid.length][grid[0].length];
7 T- k2 R& k$ l% a& @* I+ y       for (int i = grid.length - 1; i >= 0; i--) {9 K2 A( I& y/ g& `' H' W, M
           for (int j = grid[0].length - 1; j >= 0; j--) {( c1 m; Q/ [# _" }
               down2[i][j] = num(grid[i][j], 2);& z% ?+ ]% q: C% Z  D! D2 R+ b
               down5[i][j] = num(grid[i][j], 5);
1 e9 ?  j# |1 A' V+ T% P               if (i < grid.length - 1) {
4 t9 \# a3 l4 W                   down2[i][j] += down2[i + 1][j];' m1 R. ~, L) B  U8 s0 I6 Z9 d
                   down5[i][j] += down5[i + 1][j];- E) e, L' y- Q/ n/ `
              }' H) {3 v9 J6 l0 E8 J: @( y8 m. F; X9 N
          }' M9 ?" g# d6 x, i" J9 C2 z' n9 ]
      }
7 K2 t% s+ U7 u1 w# v5 ]       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数& P2 d8 Z1 i9 m5 }& w8 H  r" W2 S
       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数
) ]  y* y7 ^$ M) W       int[][] right2 = new int[grid.length][grid[0].length];
8 U5 Q4 q) k) Q4 W: ^) Z' O       int[][] right5 = new int[grid.length][grid[0].length];- \$ K+ M# L; ]) d
       for (int i = grid.length - 1; i >= 0; i--) {
9 D# d  |9 F. c0 l, R           for (int j = grid[0].length - 1; j >= 0; j--) {. J& F3 D1 n' l2 w# L6 M  p
               right2[i][j] = num(grid[i][j], 2);9 C/ W$ f- s7 i
               right5[i][j] = num(grid[i][j], 5);' R* ^- Z4 o& T. z) ^0 B
               if (j < grid[0].length - 1) {
! z# l3 I& R3 ~                   right2[i][j] += right2[i][j + 1];
+ W# a3 e( ~% m  Y! g2 m" x8 {                   right5[i][j] += right5[i][j + 1];
" d( M: z3 T( w) ]* B$ Z6 G              }7 k/ n2 {/ w2 e5 k! @9 `. z
          }' g; T, n' U' \; m# d" R
      }" I( X" b9 M! Q' k( k& }: G

0 J& d6 ]7 @7 v  d" O. Z       int res = 0;
0 F. o' {- G; {       for (int i = 0; i < grid.length; i++) {& B8 ^& I# X2 a! R/ y" a
           for (int j = 0; j < grid[0].length; j++) {" L7 P" r! e7 `0 S: }/ o& P
               // 有四种转角形态
( J1 u3 b" p% d8 |3 ~' G% v( Z: f               // 1. up + left
& u" {& p  G0 @3 a, v5 s2 _               if (i > 0) {: {% b7 H. z$ j5 T
                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
! ^5 c, |# W, X6 o6 ^              }
) p$ ?( H. o* m0 S+ a               // 2. up + right
5 c9 C" J( N8 R: n5 M               if (i > 0) {% K# Q" s3 Z# _% z: E
                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));3 s  Q4 l+ ^, t  p  p2 M
              }
% d6 b/ W# D! g% A& j7 _  p* M               // 3. down + left6 s' z* @3 J8 l# \, e+ S
               if (i < grid.length - 1) {
" [, k. x7 R2 w* R; E* K                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));
) H5 g, @4 A2 S. Q1 H! p# s              }
- z  n8 N$ \- i) D6 [- G/ _6 v; U               // 4. down + right
. D1 V. {3 e* m9 S* |# ^0 }* C               if (i < grid.length - 1) {" [2 i3 O4 Z; G2 ~7 ?
                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
0 b; s( @+ o2 w2 h# C% H+ P! v              }
+ Q& w9 y% |. t4 j! ^1 ~               // 不转角
, F! C/ J( q7 M* s               // 5. up/down/left/right
4 u7 h  l2 G( W* M0 f) w: t               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));
* P4 K, Z( H) v' Z               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
7 Y. D  x6 |% W8 s6 z               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));% S; G6 v( K' w' x; y) |
               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
/ K5 t2 T' K/ L1 e% h/ T: F+ n          }" d7 @+ k6 P* o/ ]" V9 q) d# ]  X
      }
8 P; M# ~; z, V9 S) ?3 P       return res;( e2 M) a( _1 I3 t
  }0 T7 a- |# T( i/ T5 q  C1 f# U: R% s! |
( K5 p1 ^7 t$ ]9 H
   private int num(int x, int y) {* Y2 E, _- p) j! L; N; m$ `# B
       int res = 0;  }% |" W: E5 T5 w) t5 r) ?
       while (x % y == 0) {: i! W0 v" ~" B2 U+ q
           res++;) Q+ _% a2 K' K) L, h" ]8 t! a3 v5 B
           x /= y;
+ h% P: ~; D0 l6 H; {4 S- f. u; w      }
. N4 G4 |# L1 a1 `- U% M       return res;2 I0 V/ F1 I. y- [
  }' ~9 A3 f8 O. I
}, m+ c6 f* v% e* w9 M9 D: f2 x
5 _; m+ ~5 T' p! g
【 NO.4 相邻字符不同的最长路径】
3 O3 ^% v* l2 H2 Z% U4 |; q+ P. \( Q
解题思路1 q& z) J. f, v* [; K: J' |/ J# ?
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。
8 b7 _. o% K; ^7 ~4 u1 Y& n
1 A) e7 Q3 g' b7 }代码展示
2 a" E( ]9 o) Z0 }5 ^" W- o8 E1 Z2 c3 v, |2 B7 b/ N
class Solution {
5 _4 Y. t! @3 l8 @' |5 I   int res;
3 m% g3 V6 p8 G: ~0 @1 ^& i& O9 ]9 g+ L( [2 b7 G
   public int longestPath(int[] parent, String s) {8 N9 d' l/ z5 Z- e' G6 C
       Map<Integer, List<Integer>> children = new HashMap<>();% q2 _, @8 ?4 C
       for (int i = 0; i < parent.length; i++) {
6 `: S' h4 S- L3 ~0 H% y. g$ o           if (parent[i] != -1) {
9 |/ B0 J, {0 v+ q- M               if (!children.containsKey(parent[i])) {2 J9 z, t/ |+ e4 c
                   children.put(parent[i], new ArrayList<>());1 K9 O0 _( k. m4 ^! H
              }0 F+ M; m7 P( X, K" z3 J
               children.get(parent[i]).add(i);
* _; K, L) m: |: c+ C3 B' l3 B6 n          }
  l- q" ~: F6 C5 T8 o, v, N- n      }: m  o7 D# ^8 A9 \1 T" F4 R" G
* {/ A9 x9 \+ m" U1 ]5 B
       int[] maxLength = new int[parent.length];
( U) O4 `9 o  L) p       res = 1;2 \* l' E: K# T  c* H7 {
       dfs(0, children, maxLength, s);
2 C, O8 l3 N9 o! U, J: J$ Z* {       return res;/ G# v' [% r& F) e( Z
  }' T! n- _; n9 H. E; g1 R

8 u2 t) L, F; r  U   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {/ O' P: z0 b; j* c
       maxLength[cur] = 1;
5 `- ?) Q. R/ C       if (!children.containsKey(cur)) {2 T; ^0 e9 D) L( @1 ^
           return;1 R, G8 y1 N/ A
      }
. d( d' s! h5 I6 ]7 G       var curChildren = children.get(cur);  @; B) x* H( _6 ^
       int first = 0, second = 0;7 i8 r1 D, J, P0 d  O2 ~+ }
       for (int child : curChildren) {9 l: D7 G4 F3 S) u/ V5 T
           dfs(child, children, maxLength, s);
9 i) O( t6 b, G) Q- c           if (s.charAt(child) != s.charAt(cur)) {
5 m: a, E* G" Y" c               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
! h& a2 D% _4 R               if (maxLength[child] >= first) {; r/ T- x$ e, N( |' d5 o
                   second = first;" I3 R1 r, L; \7 h* A  L  y
                   first = maxLength[child];/ c% ?- n3 v& g
              } else if (maxLength[child] > second) {( s, Y( X8 V& M  B' S5 r
                   second = maxLength[child];
; J. }4 p! V6 Z" N! G7 p              }4 k2 _9 n8 l/ _" M8 w, d2 D1 L5 Y
          }' e8 P0 s% ]- N3 I+ d' x1 V
      }
* ]& }* ^; m8 w5 d       res = Math.max(res, maxLength[cur]);4 y9 w# C) c- u, S1 F/ c+ V- C
       res = Math.max(res, first + second + 1);% Y9 O  {9 }6 h& B4 ?, r5 d9 z9 w
  }- i/ X4 ?1 Z! Q0 X* r; ~/ W
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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