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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】7 c* `0 Q9 D" A5 B* ^
6 g; T/ T  K2 `4 {! P+ B
解题思路+ R" G2 d) S. Z$ a7 n& z) a2 I
签到题,循环处理即可。
' t  w# p  K+ ]* C9 ?7 {: p
: I8 M7 |& L% Z4 s代码展示
. o7 t+ \- f3 Q* r
# O1 q- z/ R; X% P# P- v$ I) dclass Solution {
6 `' t, c- @! w" W, u9 o1 ^   public String digitSum(String s, int k) {* {: u2 [' Z+ v+ \- g
       while (s.length() > k) {
/ C2 j: n. f9 q$ A1 ~1 s9 z( a/ n1 c" q           StringBuilder builder = new StringBuilder();
+ K1 X" s  A) E0 @5 M* D           for (int i = 0; i < s.length(); i += k) {' l( A/ f, P8 @( i* c/ u2 }5 V. g% a# V
               int sum = 0;0 ^! @  }6 L! U# H6 ~& m4 v
               for (int j = i; j < i + k && j < s.length(); j++) {( M( h2 m% X) J. S  [. h
                   sum += s.charAt(j) - '0';# g0 M. l6 Z7 D% X) q, ~
              }
( y8 V1 u; ^+ H+ K1 h5 L% M7 J! {               builder.append(sum);
8 g7 @7 X- l" p. q  v9 D' V. W          }$ D- N# Q" L, U" u$ X- H2 `
           s = builder.toString();
& g8 n# I/ A6 c/ u      }; u2 z1 {9 k5 b! e$ L& {0 g
       return s;" {: {2 K$ C- W2 A2 y+ K) L# j! i
  }
: S3 x+ n- n& j+ H/ v* L5 Z}
- B2 O8 R, E& ?: F
6 U2 K; ~6 H! ]
5 k$ B0 a: b. I9 K8 h1 u【 NO.2 完成所有任务需要的最少轮数】! J$ a) {5 H3 F3 l( n, ~" ^

, {8 n, ^. u) r6 E' Q3 W# V2 @5 R解题思路
' w4 k; a& A" a使用 Map 维护每种任务的数量,然后使用 dp 求解。
6 \0 ?. u2 }  \  }" Z+ F% N  D: i5 K! `7 R5 \
dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
& _* G3 D1 m% _: E6 n1 o1 D/ h; }$ N6 e0 g$ F
代码展示
# g+ p" |4 k" _- j% d* T" f5 |% B1 ]7 B
class Solution {  a$ H% ~7 r3 Y
   public int minimumRounds(int[] tasks) {% B. O8 o6 V+ X/ k; \
       Map<Integer, Integer> count = new HashMap<>();
, M) Q6 g( E% Q/ {8 r       for (int task : tasks) {3 k4 _5 G$ P: S$ y' a# N$ C5 p4 L& U
           count.put(task, count.getOrDefault(task, 0) + 1);8 P/ P- J5 X3 i' ?* n0 [
      }5 w6 r+ H3 l1 M" C: I
       int res = 0;  s# ^- ~; x( H% Z- [
       int[] mem = new int[100001];
( a# U& t' y- |4 M) \5 @       mem[2] = mem[3] = 1;3 p2 W% W% @8 s, w( T
       mem[4] = mem[5] = 2;  k+ r  \; R9 X" D6 p7 D
       for (var entry : count.entrySet()) {4 J' ?: t7 n- i. |: Z2 P3 V) L7 B
           int cnt = entry.getValue();
9 d2 F2 b0 u/ Y, [- h           if (cnt == 1) {
7 f; ?$ g: z3 Z2 \. `3 e  N% F" v               return -1;# `  z9 N2 I3 D% d4 @- b3 Z. W
          }
" |7 s- W5 y5 m; E' _0 C% l           res += dp(cnt, mem);
7 x. u* `1 |) Q) ?# a/ D7 U      }
# `  {9 [. q; D; f       return res;& U: p4 J6 s9 o
  }
: v' P; H0 e& c4 d: b- w/ x
1 A) b7 H4 i7 I( m6 ?7 {   private int dp(int cnt, int[] mem) {
% D8 o) X+ H9 M/ {# U" ~/ S6 {       if (mem[cnt] > 0) {' Z2 A7 P4 k' Y6 w/ W* e2 ~+ R4 S
           return mem[cnt];7 j; w2 J0 H" m( o7 l  H2 M
      }+ S4 }, f" A7 G* `* h( \  l! [
       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
& w0 z) K1 Y' o3 n2 Z' E       return mem[cnt];" x1 C# v! ]3 P8 ~# v0 I2 Q) }
  }* K4 d% ]9 _7 |) p7 o+ ?- ~: M7 E- O
}( v) x8 A9 G- }- H" \
' k/ ~" u: N- r
/ g8 ?9 s3 d! K! U# }
【 NO.3 转角路径的乘积中最多能有几个尾随零】
4 F5 I; M% K7 |- u  Y" C$ c. l! y6 A: U
解题思路
9 o$ V! a9 h1 C. X! p, s尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)/ k6 l; r; ?' ?3 Z- l/ Y

1 W5 Q; h: n2 p代码虽然很长,但大部分是重复的逻辑,详见注释。
5 K' J$ a+ l2 d7 \! H3 W# V: O$ f( |* ^9 o
代码展示; E& y7 Q* |/ h
+ j. ^% T. D6 P" c( y
class Solution {
! x4 E: K" s5 {6 e( z/ t   public int maxTrailingZeros(int[][] grid) {
3 S' _6 }2 A6 b       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数6 R* L  v& A* Y" L0 e$ I$ c. G
       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数5 T0 [+ L. Y7 ?, z' K
       int[][] up2 = new int[grid.length][grid[0].length];# s" L1 F8 n" A/ C1 T: E
       int[][] up5 = new int[grid.length][grid[0].length];/ y4 t( [/ ]1 c3 @
       for (int i = 0; i < grid.length; i++) {
( Z1 R! d" T+ E) ~           for (int j = 0; j < grid[0].length; j++) {
. {4 H1 P! M! L               up2[i][j] = num(grid[i][j], 2);
7 [4 R; k7 T! @1 y               up5[i][j] = num(grid[i][j], 5);
; w, |) \" B* |% A0 i% y3 o' |               if (i > 0) {0 a. ?! {2 M2 L' L" l" G
                   up2[i][j] += up2[i - 1][j];: p2 T& j# {% \7 {
                   up5[i][j] += up5[i - 1][j];6 g& j, A- j5 y3 E" j
              }" _' P7 I) ]7 h% `
          }! j/ X& i( t! |2 [
      }. T1 V; B# Z! G1 m) q
       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数4 i4 c5 z4 Q) a: a6 ~0 T9 [3 S0 G
       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
3 z/ s: o, H& u4 N" o       int[][] left2 = new int[grid.length][grid[0].length];/ S: K: Q2 h- j: ^  q5 L
       int[][] left5 = new int[grid.length][grid[0].length];5 ~2 b6 J7 L! H2 f
       for (int i = 0; i < grid.length; i++) {
1 I/ I, I0 R0 B  J           for (int j = 0; j < grid[0].length; j++) {
1 I. U5 _& E7 n1 P( C% m               left2[i][j] = num(grid[i][j], 2);; {( c5 b: i0 y% G. m9 D
               left5[i][j] = num(grid[i][j], 5);
* C3 N' e2 \2 v2 _' A; P% B               if (j > 0) {
  r4 p2 E7 R8 J+ C3 B  n/ s                   left2[i][j] += left2[i][j - 1];
- U! ?" i7 e& L& N3 R% k                   left5[i][j] += left5[i][j - 1];/ H8 v" p  e9 S* }3 u# g5 I
              }% g- E3 g0 d8 |9 ~
          }4 Y! Y( h9 S' ]- p9 G
      }
. p& [& j) e8 c5 u/ f6 {& o$ j       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数
& K2 C( O# [# G$ q/ g3 J* T       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
$ j7 g5 u2 R  F: `% m0 p       int[][] down2 = new int[grid.length][grid[0].length];8 n0 A1 ]6 _& I
       int[][] down5 = new int[grid.length][grid[0].length];7 m2 T: h' d. [% K
       for (int i = grid.length - 1; i >= 0; i--) {
! G$ b% o3 O) P( j' k  H! \           for (int j = grid[0].length - 1; j >= 0; j--) {
0 W: F8 \1 Q5 p               down2[i][j] = num(grid[i][j], 2);
; ?; ~/ v9 j/ J) `5 f               down5[i][j] = num(grid[i][j], 5);
' M# C: r$ C, R               if (i < grid.length - 1) {
, n2 L. [$ w2 N9 V6 A                   down2[i][j] += down2[i + 1][j];
- C* V0 _" X. h' b0 v                   down5[i][j] += down5[i + 1][j];
3 E. _6 v  b* @              }3 m: S1 k' c' K! e9 {: ]
          }/ }, q  _" D) P2 ?- f' F
      }( e* j' J& }# h. w1 }6 W; j$ y1 l
       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数. |$ m) g3 ^# Z+ D
       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数/ s, Y  Q% X# A
       int[][] right2 = new int[grid.length][grid[0].length];
( ^/ r! e7 t2 Q5 D       int[][] right5 = new int[grid.length][grid[0].length];
4 G7 H( L# {( D9 q' l2 |       for (int i = grid.length - 1; i >= 0; i--) {& Z# O  S* k* }1 r8 d& ^
           for (int j = grid[0].length - 1; j >= 0; j--) {; @4 H. x( `$ Y: }* C; I' h1 ^
               right2[i][j] = num(grid[i][j], 2);- j6 U7 j3 i1 D0 U# u
               right5[i][j] = num(grid[i][j], 5);
! z# ^. p+ X* L6 J* t5 v) C# {0 o               if (j < grid[0].length - 1) {
1 O6 F6 Z- b! o. O                   right2[i][j] += right2[i][j + 1];9 R- U% S' d! P! y% o, p0 s) X
                   right5[i][j] += right5[i][j + 1];% y# C' M: o3 z& |0 b
              }4 w/ C# E5 d1 j. Y- N% F
          }  V- K& V. U7 n+ v* n3 E" Z: y
      }
& v# q; b7 n+ g: Z# ]6 {4 {5 T2 @- r% r- s5 f8 K) |) j( C
       int res = 0;* R: S, z0 F% ]% Q  [5 ~( m$ d' T) k
       for (int i = 0; i < grid.length; i++) {  n: K2 G9 [& E) I& q2 z
           for (int j = 0; j < grid[0].length; j++) {/ o  C1 C" J6 y
               // 有四种转角形态
- L% `1 v1 X7 C3 Q1 R$ u               // 1. up + left, |# K7 t, P3 E4 `* {% Y3 F
               if (i > 0) {
7 v$ i  x* f/ o. _1 W$ Y- x                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
( e% H! @; X# I: r8 Q$ _2 Q2 t              }
8 k% b0 o4 r$ h/ s4 t; k               // 2. up + right
0 U( X! Q6 y' z               if (i > 0) {+ U, s' D9 Z  S
                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));) R4 @, y3 h( z3 {6 T! \' ~6 B
              }
6 H9 ]' o. t- X9 S- P               // 3. down + left/ @) C3 c( m4 Q8 [- E/ E) N
               if (i < grid.length - 1) {% |0 a, y  x! n- F6 D" }
                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));/ a7 y9 x, p" I( E4 G1 W9 g; s% R
              }
! b+ l4 T9 O" Z) [4 h; p+ J) i1 m               // 4. down + right
1 l/ y! d. b1 X2 ^               if (i < grid.length - 1) {+ K3 j3 Z  D6 `4 y3 i3 W( m7 x$ a
                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
7 ~$ y) I$ g" v+ V. v              }
* {+ }+ Z0 n. c  z# C               // 不转角
/ B' C( w( \; s+ B+ Y7 k5 g               // 5. up/down/left/right
' T" E, ~7 M8 Y  i7 B! u/ S8 Y               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));
; i' F$ ]9 v6 ]* N1 p               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
1 K1 L% A1 ]. J' H. s& Y2 `$ W, }               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));& P5 V& P& q6 @/ E
               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));& d# N$ b4 j/ j. n, L. ^0 m
          }
& b  A  Q4 C) s* G* ]3 S      }9 J! E, X7 L- K! Q( h. [7 |" @
       return res;
  z" a) l; n- e. `  }
& i& m3 g8 b( l1 z
; z3 N9 i" a- a  @" b   private int num(int x, int y) {
! C8 R: G" x! w0 B/ ~  h; B5 v1 Z  ~       int res = 0;
6 b! B( U* O* o" t' X4 X9 G       while (x % y == 0) {# f$ V* r  j* t7 {
           res++;
. B, q  b5 n& G2 F: d           x /= y;
) G6 M3 {$ U# i# Z1 m      }
8 V2 K' E( I4 b6 v  [       return res;
' t; Z8 H6 }8 x5 T2 ^( F  }8 S" n4 i$ n* H0 h% \( U
}
5 S1 K$ M: o9 u) A, M  \9 ^5 ~. E; [3 Z# ?9 S( Q  k
【 NO.4 相邻字符不同的最长路径】
5 X. f0 c7 g6 l3 g6 E) }7 n0 c. |. L" y) P* e* P/ h" W! O8 @( Q
解题思路9 S* ^5 s6 `7 H2 h0 [0 T+ i
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。
; A: G( ?2 `( f$ l1 t3 _: n# V% @: D9 e- r! D1 V- E8 S7 X# G0 g* p
代码展示
; R$ E: d6 k: G7 q% Y
& g: W/ g8 Z+ o" a: vclass Solution {
& X6 k4 z: U" y' B9 i0 o   int res;
4 {7 `' ~, M+ c; ^+ D6 z" W$ ]: ~! I% s) M, |( ~3 g
   public int longestPath(int[] parent, String s) {4 X0 w0 Q# k9 {+ ]2 @+ L# U
       Map<Integer, List<Integer>> children = new HashMap<>();) ^; g# ~+ [9 S5 R% z3 y" j' H, L
       for (int i = 0; i < parent.length; i++) {
! X2 O& ~6 |- m" z& w. E9 e. i1 U! |           if (parent[i] != -1) {8 d- @( S, U! u! y1 [
               if (!children.containsKey(parent[i])) {
, H7 y9 P- B4 e+ r( L                   children.put(parent[i], new ArrayList<>());1 }7 N: G6 V  X8 o
              }
5 r* A3 }$ c$ a# t+ {7 a' G& O               children.get(parent[i]).add(i);
- O' t( Y- f8 R6 G' ?          }
7 @& x6 Q) p; k" Q" d/ `      }4 \- V9 p* a; p
( u0 e7 J) o9 B# Y. _+ P# L( J
       int[] maxLength = new int[parent.length];) F+ c/ b4 Y# @. ?
       res = 1;
- ^4 Y# H/ R. |       dfs(0, children, maxLength, s);
4 k2 Y  n' W  t2 c" B       return res;
' o5 p# N  o; C3 [& M  }7 E7 r% ~/ f4 d

. }# H% U2 I5 t+ r   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {
+ d; r( }; k' t. O       maxLength[cur] = 1;% Y/ e& M1 q4 U; Q, B. c6 d
       if (!children.containsKey(cur)) {
& o& G8 F- h" O( ], A" o           return;
( t, b  f& n( J$ e- g- q      }; b- o( T; z0 p1 d4 O3 |1 x
       var curChildren = children.get(cur);
( K9 U  Z! }& q       int first = 0, second = 0;0 Z8 c; O' }9 A5 g
       for (int child : curChildren) {0 q% H, @8 J: E; ~  r4 q' s! ]
           dfs(child, children, maxLength, s);
) X5 w7 E- P3 p: S7 t% i           if (s.charAt(child) != s.charAt(cur)) {' S" x; y& d# D8 i* b" S6 I
               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
% Y  g, r7 w" g- {- i- g# D0 `               if (maxLength[child] >= first) {+ r" `2 b" Z* [5 g+ I' G# H
                   second = first;& K  z- `, Y# X1 W4 b0 C
                   first = maxLength[child];
' W" P  a" O; q" |/ ?! ]* L) p              } else if (maxLength[child] > second) {, {2 u5 o+ V" ~
                   second = maxLength[child];2 N2 G+ |5 X4 x% s& i
              }
+ S- g8 Y& Z; \. U8 Y          }
  I9 N8 D% j) M6 P( r      }6 W- l4 y# v" A# d, |# d7 v1 t
       res = Math.max(res, maxLength[cur]);: i# U+ b" O' h/ i4 T( Y) j; h
       res = Math.max(res, first + second + 1);
* m1 s( w3 d' A1 S/ [  }9 t# a, K1 `$ {5 _
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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