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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 计算字符串的数字和】
  O  T2 y8 a  w: v2 X/ Q" h; z) w
/ e! o& ^- B2 K解题思路
! y: x/ h; m+ h) c签到题,循环处理即可。
' N2 ?: T1 j1 h" i
& G/ D) j* Y) C7 y. z' P2 j) ]! k代码展示
6 G$ F' r: D( E) q( l7 n
" I+ k* e* w* e6 [5 ], H5 b8 lclass Solution {+ H+ ]7 G5 J) D/ O0 W0 r
   public String digitSum(String s, int k) {6 F$ E/ S4 K  d8 F& w' @5 e8 i
       while (s.length() > k) {
8 s. @9 Z3 u9 z$ b           StringBuilder builder = new StringBuilder();
9 o( f+ o1 I& H# h1 D1 p+ M" h( [           for (int i = 0; i < s.length(); i += k) {5 r: g- d, M7 ?! i6 q
               int sum = 0;1 F6 M: y4 W' v* |$ X6 Q
               for (int j = i; j < i + k && j < s.length(); j++) {1 F9 ]5 Q8 @+ M) N& k3 F/ C9 o, S
                   sum += s.charAt(j) - '0';8 @/ Q* A$ W2 [
              }
( `' ?- W2 s$ b/ _; {               builder.append(sum);) C6 s" k3 \% t5 X" v3 H6 p) Z* s
          }% k& n. P' {; U+ h- o" C2 a
           s = builder.toString();
+ d' {( j: p" Y* J9 o4 n. H( Y      }" K/ S4 J$ h' \
       return s;
: V* J' R; Q; [# c% F  [8 \  }
! a* h4 o/ }# m. \( M, ?}
+ i' m# p$ D% u% |: P$ \! q; }4 T7 b, K0 g: i

& k+ ]' s8 ?3 }# F: `【 NO.2 完成所有任务需要的最少轮数】* [' G7 G- j5 ]( W& P
1 \/ k, ~0 Q2 o, s5 H& N
解题思路
5 M2 E0 G. S/ R6 D使用 Map 维护每种任务的数量,然后使用 dp 求解。( `4 x/ X; j- U# t: O" Z

! J$ X2 ]6 Z0 B# @  |# R' rdp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
8 P, a2 M+ a) |6 y3 E1 O$ q" Q7 i7 w4 J! D' o0 @2 ^% G3 _
代码展示
# u; g: K+ ?3 G4 g1 b1 }/ P+ G9 M6 |# `. E" H' I! O
class Solution {0 v! _; X0 I$ g; E5 m4 j( E
   public int minimumRounds(int[] tasks) {
4 @' r% K# m! J% V2 g       Map<Integer, Integer> count = new HashMap<>();& A1 @' D2 o' r8 I
       for (int task : tasks) {
+ y8 G! r$ q) U7 g- ^           count.put(task, count.getOrDefault(task, 0) + 1);* Q" \+ a2 D! ]# j8 w2 S
      }+ [  a: k$ F- d4 s9 A
       int res = 0;
+ [( z4 e/ ^/ f0 l4 o# g       int[] mem = new int[100001];, N  u5 x( s' l. L4 Y3 ^' Z
       mem[2] = mem[3] = 1;
& j0 V) _  q- m% _       mem[4] = mem[5] = 2;' W! m7 U, M0 Z( {
       for (var entry : count.entrySet()) {- ?! Q; m$ e6 c# L- m
           int cnt = entry.getValue();& P4 w6 ^8 T( T8 @4 E( A" W
           if (cnt == 1) {1 N; i- i) q. T0 W1 \* p
               return -1;
& s5 ^; P) w' \/ X' {  a) t% p          }
2 K: o+ }* S, k1 p- @           res += dp(cnt, mem);
0 j, x: E7 p7 h$ i      }
. _% j  K" ~3 p* m$ N* L  Q       return res;5 Z( i9 v- y/ E$ E* n
  }
5 v/ N9 f/ b  W! L1 ^; S' Y0 g/ c& T9 W/ f3 Q4 ?
   private int dp(int cnt, int[] mem) {, v$ s( d9 M: {
       if (mem[cnt] > 0) {
: U/ E* {7 T- a5 p# x2 g8 n           return mem[cnt];
. m) _# |" u% l( c0 l4 k8 W# \* s      }
$ i! r9 _& k/ [2 N6 C       mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);2 i1 U8 T/ Q( ?" \# \
       return mem[cnt];6 G9 R# \+ K' t3 T, y( i9 E1 ^2 b5 ^
  }
% b- m8 s# O. n. V}
6 P3 U) q$ D8 v$ ?8 D+ g+ n; v: }
0 u& x5 y" h: n* B3 j- d* m8 X- Y9 c. |. Z* Q, @2 b! |: ^# k
【 NO.3 转角路径的乘积中最多能有几个尾随零】# v$ `1 b( v+ S8 s
  T5 F% m; _8 ?, s5 I4 D! }" x
解题思路& l: V" p7 f& @3 h
尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)/ j; A9 o; `/ F

- E: G$ I+ \% e4 }5 d3 F+ @代码虽然很长,但大部分是重复的逻辑,详见注释。
- l4 U5 @: O8 d% q5 ~* W) h. v& W% Y  o
代码展示
0 x6 i9 A0 R3 t8 b# S0 _
# F: V* i* @0 s) _7 mclass Solution {
7 q5 X2 Q2 x4 \- C   public int maxTrailingZeros(int[][] grid) {3 L' P, `$ Z! g3 x  ~& q( b
       // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
) e* |3 N! p9 M  Q6 w       // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数) Z. v1 ?# u! I+ Q$ Z1 S
       int[][] up2 = new int[grid.length][grid[0].length];+ m( X& R7 m# O5 W. E
       int[][] up5 = new int[grid.length][grid[0].length];
1 E8 T1 r- ]! ?' o' V3 K; c       for (int i = 0; i < grid.length; i++) {
% i, U) [9 t0 c( [; `0 L1 ?+ X           for (int j = 0; j < grid[0].length; j++) {' S0 @- t: j9 R' ^3 {
               up2[i][j] = num(grid[i][j], 2);
2 I' A3 l  M; S. @& u; J( }: D4 B4 n               up5[i][j] = num(grid[i][j], 5);  B1 i9 w  K: K( n7 r, y, u, q! L
               if (i > 0) {3 q$ x( v9 I  l- H) _
                   up2[i][j] += up2[i - 1][j];7 F* ?/ P) @3 y  k5 ?% l
                   up5[i][j] += up5[i - 1][j];
/ T+ A# R" u& s1 j              }
: \; c" `' h6 x5 u  @/ ]7 I          }, @$ m- y+ ~2 _* O$ `# }
      }
6 P. Y8 Y3 N1 |. T: D7 _       // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数; h" B( Z5 _( q6 K5 b) j* {0 i* ~5 R" @
       // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数# \$ x3 C5 T7 l* L( f+ F
       int[][] left2 = new int[grid.length][grid[0].length];
: d. x' S; F0 y8 h  C       int[][] left5 = new int[grid.length][grid[0].length];
2 ^: N4 \" p2 I& ?8 {       for (int i = 0; i < grid.length; i++) {
6 j5 ]  F: @) }% D. L           for (int j = 0; j < grid[0].length; j++) {# t- D" K, l" ?5 K  c7 s
               left2[i][j] = num(grid[i][j], 2);1 E* |) c9 x) e  j( Z% c3 P7 H
               left5[i][j] = num(grid[i][j], 5);2 |/ o. }% O! p/ @
               if (j > 0) {# A! A, T( w% Z4 {' Y1 b* I4 K  t
                   left2[i][j] += left2[i][j - 1];9 P8 D+ |$ L, v7 b
                   left5[i][j] += left5[i][j - 1];
  a/ l+ u! G0 ]. h5 [7 k              }0 q9 p) E! F* _' z
          }
& h# M; @$ q6 O7 r2 P      }0 k. t. ^: c$ @4 S+ a
       // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数8 g* j2 b; g# t& B- I
       // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数1 X5 }9 n* S4 O6 ^" i
       int[][] down2 = new int[grid.length][grid[0].length];
" B; s) h4 s  F4 K( n- m9 [       int[][] down5 = new int[grid.length][grid[0].length];
( W1 o  g' m& |8 S8 v* i       for (int i = grid.length - 1; i >= 0; i--) {' m; M3 j0 o& Q+ i
           for (int j = grid[0].length - 1; j >= 0; j--) {
6 s/ ?1 `' k: J1 s: M               down2[i][j] = num(grid[i][j], 2);* @$ u- b; g! s+ y7 E
               down5[i][j] = num(grid[i][j], 5);# j% G0 N& h. I
               if (i < grid.length - 1) {
5 f3 n4 e8 ?- s0 I4 G/ N: D                   down2[i][j] += down2[i + 1][j];# _( p4 c5 a+ z. U( K6 s0 X
                   down5[i][j] += down5[i + 1][j];
$ w$ @% e$ j4 y& \7 {" w              }
0 V5 \. M& t2 r1 S          }
- n% ^# w& z2 V! w( O( N      }
4 B9 y; X+ Z* H' Q, p5 d# {/ G2 U       // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数" S' j7 l2 w2 H
       // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数5 ]% N$ m. x$ k9 u- G+ p" g! _* X
       int[][] right2 = new int[grid.length][grid[0].length];/ r4 o& P% T" w; Y7 D' z6 G
       int[][] right5 = new int[grid.length][grid[0].length];
  w8 V& N( q0 v: ^8 \: I0 l       for (int i = grid.length - 1; i >= 0; i--) {. j( R7 B- J4 o% I) p; T9 f
           for (int j = grid[0].length - 1; j >= 0; j--) {  |3 i% p# D& @3 L" v6 F
               right2[i][j] = num(grid[i][j], 2);
& Z- N5 o, W0 @: f5 V               right5[i][j] = num(grid[i][j], 5);& G3 D" L5 \4 d4 r3 O* R/ v0 [
               if (j < grid[0].length - 1) {
/ @) B, D! G" w/ {                   right2[i][j] += right2[i][j + 1];6 W' L% V* O9 W6 ^2 m' b8 z
                   right5[i][j] += right5[i][j + 1];
5 r2 x* B9 R3 C3 B              }
% n, x3 n) B# J          }
  d$ X$ d, h+ V      }
% Z. N) p) }0 N% Y) G9 z3 ?( i) |" p$ O, d: _
       int res = 0;( K: j; y! `3 F. i. f+ m
       for (int i = 0; i < grid.length; i++) {+ E2 I/ O3 M5 b" x  P4 P
           for (int j = 0; j < grid[0].length; j++) {
/ W/ c1 i  U% G+ F. e               // 有四种转角形态
1 p/ p8 h- i% T               // 1. up + left& l5 g7 q6 b' ?' V7 X
               if (i > 0) {# `7 r, W: `# f' G* B
                   res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
, k3 q  C: f: n1 g              }
$ H5 p, _  _) o* E+ H               // 2. up + right
. P" D- o6 o" Z$ @3 a7 G               if (i > 0) {4 O4 \. U" J9 a* k7 F
                   res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));1 u! L$ `4 p5 g: x9 j& d3 G2 |4 w
              }* v8 {+ H: v, {$ d) O" w6 Y
               // 3. down + left
& `$ o8 {( L" }; i0 a               if (i < grid.length - 1) {
6 C  G, b. i, W! y- q                   res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));/ U" e5 b3 z0 \- x6 v
              }
) j6 Y, ]7 R9 i/ l7 {7 R               // 4. down + right
- p: J# k# Q) {               if (i < grid.length - 1) {% Q$ v" c$ r# M  [
                   res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));, u% R2 P  f2 n3 l1 r* Y
              }2 I5 ]0 ~' S9 U7 [# V
               // 不转角  \  e7 l. G* V- a! D
               // 5. up/down/left/right
  A. j& G0 d6 l6 k+ z% U6 J               res = Math.max(res, Math.min(up2[i][j], up5[i][j]));
* `! w$ u$ a7 j- V- Y# `               res = Math.max(res, Math.min(down2[i][j], down5[i][j]));+ ?" w- S2 H- u, K, s, h
               res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
5 Y% H4 O1 Y# f               res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
6 x% W7 F( u# F1 S2 O          }4 [% B5 a+ G" |& e3 K" J
      }
- `& c& R/ @8 w$ k0 l% J, f       return res;
6 f: ^" L# K7 Y3 X" ?1 z3 U  }- {4 G9 g6 y. H5 c" y2 N% j$ o
: q- ?+ j9 f/ X& S$ `
   private int num(int x, int y) {1 j& `2 U  U' b
       int res = 0;
8 M9 C2 [* G# S/ I       while (x % y == 0) {
1 I1 h! f* d5 e& A$ J2 O6 J           res++;
' v* A. |9 Z0 e9 F9 A- ^+ t           x /= y;
; L/ U; K$ T; s0 J      }
/ u3 @! ~3 {4 I  O" k3 i6 ^       return res;+ I8 Y3 a4 P. B" D
  }
% J9 q5 z, ?2 p: J6 y0 a' K* c7 }0 J}+ S: E" B  m, g

; T& t+ P" \( L. v; O( X& _【 NO.4 相邻字符不同的最长路径】
4 _/ H  ]; s' g. a; f, t" E+ T1 `  H, u3 i) R9 ~! F
解题思路
# R; w) |' R9 Y, B5 d3 [求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。
; _6 H& p) Y  M4 ~, q  o. ]- U9 v. j0 |1 _& G6 M$ n
代码展示
7 [/ z  e: q8 G
" W- r8 E3 k! T, Zclass Solution {2 S8 `* \& X. P% N9 g' w( h
   int res;2 u) W2 L* v  D! ?( a; U+ S" T

; H' [9 j- O7 g3 _: O) Y% {( p   public int longestPath(int[] parent, String s) {1 n2 z6 {. _, {. M: E" v
       Map<Integer, List<Integer>> children = new HashMap<>();
# j. I# U- x2 ^; T" D, Y       for (int i = 0; i < parent.length; i++) {
1 R1 ]! H: m: V& T: x           if (parent[i] != -1) {: Z* f# w: b  S6 t$ X" q, E: L
               if (!children.containsKey(parent[i])) {$ n! y3 O9 w% P$ r4 K5 G5 U
                   children.put(parent[i], new ArrayList<>());
" G3 L. a8 [7 I              }' M' d! T9 n* @" Z# ?
               children.get(parent[i]).add(i);; `2 o* t( e/ Y# g2 r
          }
7 d. s# a3 b, @; _      }2 ]3 t; u* u# v$ q5 w

0 n* R; {; x2 x3 g- m; U       int[] maxLength = new int[parent.length];
/ ?9 M' g1 R2 V3 P8 z; q, ?       res = 1;
$ w4 F0 W6 ], S: K. j       dfs(0, children, maxLength, s);! I0 W) r4 `  ^, Q' B" }
       return res;8 n1 E) T0 G* v8 a+ `* p  d
  }4 a7 V  _, k9 ^

, M2 B' w* ?6 X' h   private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {
& M/ `2 s0 m/ i2 {7 i& ~# J       maxLength[cur] = 1;& Y2 T: f) L. t9 y9 m
       if (!children.containsKey(cur)) {
2 V$ p1 B: S0 U! A           return;
) H0 q) a% R- D1 ]( A6 ~      }* F0 m7 Q8 E  Q. Q& Y
       var curChildren = children.get(cur);
5 }9 e+ v- W9 B       int first = 0, second = 0;) N+ u6 ^( E1 f0 I8 m% q
       for (int child : curChildren) {
/ F9 g0 {5 o, ?2 r% g           dfs(child, children, maxLength, s);+ M! z& S" u  I% w# _" Q* t4 M
           if (s.charAt(child) != s.charAt(cur)) {/ \  a  O# D' i
               maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
# G4 Q0 z, x# ^               if (maxLength[child] >= first) {; I1 K- J' T' r$ T* f6 F) u/ B7 q5 R
                   second = first;6 v0 U; W+ B6 z: L
                   first = maxLength[child];, d. t( Y/ r. x' U* n9 t
              } else if (maxLength[child] > second) {2 Z. J+ _6 Q2 N$ W+ E1 O7 W
                   second = maxLength[child];0 n  v9 Y7 ?. j$ @6 N2 M7 n
              }, J) P# t6 h/ B) [( a) S
          }8 v% J6 {2 A1 {; r; y" E
      }
/ S) c! J# |0 J- r) U+ }       res = Math.max(res, maxLength[cur]);
) i6 O' R' @  a0 C) g       res = Math.max(res, first + second + 1);! O" c9 h3 r( @2 ~, ~. X+ J
  }
4 z8 [# e( j: K7 s  f+ {  ]. @# v}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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