登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 计算字符串的数字和】6 ~' f! U% Y5 K; F. L) h, U
+ ~+ u# i" n# V5 a解题思路! V. ~& \# q4 w& g
签到题,循环处理即可。
/ d$ n7 I5 h4 H4 d, p- c' `/ s, b9 k! A
代码展示2 q3 ~' M/ h" ^
, s# G* p, }, ]& x! H# Y2 iclass Solution {
0 C8 g0 r* X) Y% m public String digitSum(String s, int k) {
5 ~4 ^. a& I' v& C& B while (s.length() > k) {
$ H9 ^) [% N2 y$ V) s" t1 j StringBuilder builder = new StringBuilder();
" n: H6 L/ y3 k+ u$ q6 o for (int i = 0; i < s.length(); i += k) {$ E9 g/ ]$ }1 E
int sum = 0;. h6 v4 v' P) x' p8 X; l8 o* r
for (int j = i; j < i + k && j < s.length(); j++) {
8 F7 t0 ?; g' P: w: S$ d z# U sum += s.charAt(j) - '0';
) r% U* k- [& E- | }
% W- w8 C# ]6 Q) A/ r6 r builder.append(sum);
$ R9 f0 Z. \0 o6 H* ^ }' f( X& l* B7 o- ?+ Y
s = builder.toString();
; I. u6 H3 S0 m; d# r2 q0 ? }4 N* U5 @" g" O2 R: s8 u* ?# H
return s;
5 @' x" T; t" G# f8 @: n$ C }
( Z& O9 m! X& A9 A" Q+ ?}
# ^. ~9 m. X* T/ n
& M, J p0 N* q+ ]. o
4 m3 X: S/ i- U0 J: {【 NO.2 完成所有任务需要的最少轮数】& \& U6 c( o0 U$ w# R- M8 q
, S+ \5 P( E3 d9 o* W k$ c
解题思路
- ~) J: N2 s2 a% v/ U使用 Map 维护每种任务的数量,然后使用 dp 求解。2 @# F$ F& {% e+ D! a; ?
7 N: W4 s; [: W5 v8 f: [0 K5 x& c8 l
dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
+ @3 q @) l6 R! x1 i" }- Y% O' n5 x
+ b1 }* z1 K+ f8 F# E代码展示
1 m4 F6 x# S+ X2 I8 G6 g- Q7 ~+ q% ^; ]" f% ~
class Solution {8 O: X0 y. I( m1 d$ X. v, Q
public int minimumRounds(int[] tasks) {8 r+ g" Q& b1 F' S9 P9 I2 H
Map<Integer, Integer> count = new HashMap<>();
$ e" \2 Y, D% o) `3 Q2 c for (int task : tasks) {
6 U9 p5 o, k6 F5 p6 Y' V' @; U count.put(task, count.getOrDefault(task, 0) + 1);! q2 M I1 ?/ w. a6 h
}
0 M8 N5 U+ `& v/ I int res = 0;& o) b7 ?9 P6 P
int[] mem = new int[100001];
+ W8 w- R% I/ w* } mem[2] = mem[3] = 1;
8 r. l4 W/ J0 T1 _, t0 x" H3 L mem[4] = mem[5] = 2;
- E! D" _2 s$ R for (var entry : count.entrySet()) {
8 d$ L. Y0 |! }/ q; x" V' s1 t. a int cnt = entry.getValue();
0 }3 r' ^; p) @2 [! ]' Y) u2 w7 w, F if (cnt == 1) {9 c# b9 d$ W$ k8 A1 E0 D/ q+ l6 f
return -1;
+ E! T- ^8 Q7 I4 R/ ?9 ^ }
! K- r9 g9 h5 I7 R$ J* P/ V res += dp(cnt, mem);5 R) j- L+ _4 a
}
j* z0 n) m8 @8 ~- H1 v4 ~ return res;
- A( x/ }* s5 X! @0 h/ g }
l( Q: u3 f2 |' u( K3 x- s' ?/ M% _; V! ^) b4 m( V
private int dp(int cnt, int[] mem) {) A$ t; T3 n" [% z l) D
if (mem[cnt] > 0) {
2 R( d) s% v5 d: q( n& ? return mem[cnt];; j! E1 @8 o* x& J
}$ e! f8 E( v8 i- f, b9 ^, t. ^
mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
* R3 _. |0 {3 X- F/ \9 b9 H return mem[cnt];
9 U, w, K( _6 a: R7 r }
9 n5 n4 i7 y) d: R4 a$ l1 z5 ^}
) o. n- f' [6 w8 |3 y: G/ W- }7 X t4 h+ ~# `/ l) M
( W# C- H) ]& v* S( U
【 NO.3 转角路径的乘积中最多能有几个尾随零】. b# K- }8 F6 y" T- e% e3 w) y
) [6 j& X$ k( e" O0 d- B5 V/ v3 i5 }
解题思路
6 B$ I: P3 [7 z* a$ S- J" s尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)
* i- C0 Q, x) a+ n# p; n5 |9 g
8 i& W: G1 b5 [代码虽然很长,但大部分是重复的逻辑,详见注释。
" G; p D7 Q2 Y5 g9 d
+ g* N2 F; ~7 `' a代码展示. E- D6 c) m& h" g8 \
; D4 g4 F6 ]% u \
class Solution {" h. p% c! J% Y ]& i
public int maxTrailingZeros(int[][] grid) {* V6 _) j! s# m9 R+ E5 T% B+ z
// up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
. X, V" M. R0 |" {* X" h // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数
+ E7 {+ Y7 I* c- x+ Z! f! g int[][] up2 = new int[grid.length][grid[0].length];
' v; O: Q' O8 u0 [) g1 F6 X int[][] up5 = new int[grid.length][grid[0].length];
" k+ C( h0 u D6 r, X: U for (int i = 0; i < grid.length; i++) {
2 ]/ x7 z+ T; ?2 w2 N for (int j = 0; j < grid[0].length; j++) {+ G P1 u' J8 K* ]
up2[i][j] = num(grid[i][j], 2);5 a) s2 z" u# R7 W: f
up5[i][j] = num(grid[i][j], 5);7 O' J% m0 M/ A3 z1 R( r. z4 H) j
if (i > 0) {2 x9 w4 e) _* E5 g8 I( h; K
up2[i][j] += up2[i - 1][j];5 ~1 D* S9 l3 A Y" h+ L, G
up5[i][j] += up5[i - 1][j];! t! a% H+ m/ A
}. s9 s* G8 M1 a" B+ J6 M [$ d
}
, i. g0 ~- n: ~% E; I9 @$ N! T }& h- ?6 X* ]! o9 x' j# t
// left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数/ g4 c: M$ x; R, c% U! _8 S
// left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
3 p( Y5 ^, B3 f0 o. Q* A- v int[][] left2 = new int[grid.length][grid[0].length];3 q/ \8 A$ A: d: I( Q. J
int[][] left5 = new int[grid.length][grid[0].length];; ~7 L$ o9 d) R* x* C4 X0 ? f+ ~
for (int i = 0; i < grid.length; i++) {! t5 I1 ~/ s G x7 ~
for (int j = 0; j < grid[0].length; j++) {
E1 Z5 u3 `' \3 ` left2[i][j] = num(grid[i][j], 2);8 U' M0 ]0 ?6 ?) Z8 X
left5[i][j] = num(grid[i][j], 5);5 I4 ]) x, r" p# B/ }
if (j > 0) {+ m! @0 J+ x5 W/ i1 q" Z8 {
left2[i][j] += left2[i][j - 1];% V3 i3 ^9 ?+ T- Y9 o4 d
left5[i][j] += left5[i][j - 1];
+ g- e# Z1 @" c2 o, A1 q2 O }
8 X7 v# P: X4 N$ E2 j$ h }
0 n9 D* l- Z/ C; G$ O$ {4 L }6 A R, q( Q1 j1 }. p' i; G
// down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数* @7 \) s7 |6 P9 \9 c! A
// down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数2 c3 U4 v \2 o3 D
int[][] down2 = new int[grid.length][grid[0].length];
! i, X( u: y/ Q) m' S R int[][] down5 = new int[grid.length][grid[0].length];
5 x8 K1 q8 V- ]7 q$ T* m for (int i = grid.length - 1; i >= 0; i--) {
# m' E) R2 d+ _% ^5 G7 g3 f for (int j = grid[0].length - 1; j >= 0; j--) {3 J g& n% E% G: n- C* Z
down2[i][j] = num(grid[i][j], 2);
4 y. z4 f$ I7 v3 ~ down5[i][j] = num(grid[i][j], 5);
9 N. u* a; |1 p& o5 {: ^9 G if (i < grid.length - 1) {
, I) j1 p. a; p; j down2[i][j] += down2[i + 1][j];
~4 h+ s; f* n down5[i][j] += down5[i + 1][j];8 z4 E5 B" y4 k: G
}
: o$ r: ^5 r3 T }* T- ]# @4 \" w9 ?/ x8 I
}
, G! w D, Q8 N& C // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数9 D4 w" {- H' A( ]8 p6 `
// right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数1 n* ^4 m2 ?! c4 \1 u: d7 s. K0 b- N
int[][] right2 = new int[grid.length][grid[0].length];
& g8 _$ I1 G& w( W' W int[][] right5 = new int[grid.length][grid[0].length];; r3 i0 P# w; h2 D' h" K
for (int i = grid.length - 1; i >= 0; i--) {0 j9 T& f) C+ E( \
for (int j = grid[0].length - 1; j >= 0; j--) {6 `, x! U3 }7 Q! S! Q0 G
right2[i][j] = num(grid[i][j], 2);. i( j& k' ^/ e) o
right5[i][j] = num(grid[i][j], 5);
" a; o3 b1 i/ `+ `4 S! [9 s if (j < grid[0].length - 1) {3 v: z t& B" t; X3 ^
right2[i][j] += right2[i][j + 1];: x9 {! D- x( v' |* p0 v, n4 v
right5[i][j] += right5[i][j + 1];! s+ d4 c8 J+ W) D
}
+ h5 c0 u0 X0 O6 V4 R }/ q' S5 Y& @, u. D& ?+ O+ E, v
}
, M- w X' M$ b. z- m( c8 \% l8 p- O* F7 m4 R! U/ @: i
int res = 0;3 v# W+ _6 i) T! s% G% x' k' m
for (int i = 0; i < grid.length; i++) {2 @, P) L. k, R, x
for (int j = 0; j < grid[0].length; j++) {
# T! J- F" `& d( M+ s7 Z+ S // 有四种转角形态
5 W8 b7 p. n4 e- W# F# g // 1. up + left8 N: K# |) r$ j% K( N
if (i > 0) {
' r5 I3 X- p- C0 b* s5 f res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
- ?. ], }* ^4 ?4 G3 }2 O }
( v* f) K2 S, F4 k // 2. up + right
5 S, D( d% `" L! [ if (i > 0) {
: k2 q% z6 h% O% b1 p) E8 { res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));
" b# E# q( P+ f+ H7 k8 [9 N# s }
! h( c9 |3 `" z7 F // 3. down + left
! p3 C# I. f: F1 W1 n if (i < grid.length - 1) {9 C. [& C& G# c9 |2 y6 x
res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));4 G. F% w# E4 }4 A$ _
}' p6 y1 x& i9 W4 P3 G" q: ]8 |- Q
// 4. down + right, O* N" }; y+ O/ A
if (i < grid.length - 1) {$ l( A) w3 M& L! B
res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));! Z1 K$ B! a% X. Q& p, R7 ]
}1 m! J5 S: l0 N/ m1 \
// 不转角! ]1 o# [8 U" a% N" M5 z7 {
// 5. up/down/left/right
7 M1 S4 F/ S" c5 M( m/ r res = Math.max(res, Math.min(up2[i][j], up5[i][j]));" E0 Z# o% x7 R% f8 P: S A; y5 T
res = Math.max(res, Math.min(down2[i][j], down5[i][j]));# e. t3 v4 J: H
res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
: M! M/ e$ E2 t V* x res = Math.max(res, Math.min(right2[i][j], right5[i][j]));& K( R' M! k9 c$ X) k& H" l& L
}
1 g( m2 M+ l% O1 s6 I, T }& y1 X5 D3 K7 ~6 R
return res;* W0 r* k' ^/ w+ r% w& m! a: |. G
}
- W4 E! n! d; J, x
) [; _% t6 h3 D& E4 Z; Z private int num(int x, int y) {- a; q& w( r1 `+ s
int res = 0;, L! X5 X# _% W+ C0 d
while (x % y == 0) {, p) Z/ m) p- f Z# x6 M
res++;
3 B; l2 I/ _ U$ x W; i- p x /= y;$ C' w6 k" A* K# W2 t% M7 L" W9 T
}
z! E4 L7 F% ~3 A return res;
h5 A0 M0 j3 i( C }9 A7 W6 s% H( ]/ {- ?6 E e3 \# f6 L
}
* \9 b, L( o3 F' M4 u0 S" Y
, h6 h" G7 R4 t* c1 P9 a( m【 NO.4 相邻字符不同的最长路径】( X+ E9 f2 `/ ^' H3 S( p7 r- t
- g" M5 D7 ?3 e. \2 i9 N2 J/ K
解题思路0 p/ l6 g) ?: v3 w5 K
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。5 p5 W' t+ c) j4 j5 o
# T) j( {6 s9 D- Q {/ S5 P- F
代码展示. E, w& e$ D% q$ J# Q2 M
, g+ e( _* {! i0 y2 X5 } \
class Solution {0 j9 h2 W. l* r+ f ^- @7 [
int res;/ \5 y) {8 X2 X
5 S+ G9 s5 {% s
public int longestPath(int[] parent, String s) {' w* x# F: B1 h5 ~: i
Map<Integer, List<Integer>> children = new HashMap<>();
1 L4 ^( F1 H7 G* l! V1 V/ t$ [ for (int i = 0; i < parent.length; i++) {
' ^3 o) s X" ^ if (parent[i] != -1) {% q- Y7 y; k( B3 _; I0 L
if (!children.containsKey(parent[i])) {
5 T2 ]4 [; U% q3 l% f8 }2 B0 ? children.put(parent[i], new ArrayList<>());
7 z7 {$ R- N6 I% `0 [2 a8 c }
. G1 E" P# j( x/ f2 v1 W( e4 A children.get(parent[i]).add(i);5 T( }( a$ A# |$ K) O
}8 l9 i. q6 c$ K( a- r7 w& n
}
$ W" ]8 {0 [. @' Q# N! n0 ]- ^, r- U) X6 A& V- l# T
int[] maxLength = new int[parent.length];2 [ d* U( {8 k) ~: G7 O+ L) Y
res = 1;% U5 h, \5 a0 r( I4 M/ c) J
dfs(0, children, maxLength, s);
j& ~( ^( [' B, ^ return res;9 I& n& ~6 Y4 Y1 d4 M O, l0 c5 b
}
$ j9 B9 u1 X; z, ^
1 N! x8 H$ w) g; w; J private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {; ~& [, R! s! ^" A5 u; d0 p
maxLength[cur] = 1;
) {' \6 X/ m$ d( j" I if (!children.containsKey(cur)) {$ m& x# c v; M5 T# _! M! c
return;
2 @1 q* |* c& w9 s; Q }
$ t# v# \- k% _2 y- j var curChildren = children.get(cur);
% ^* r6 Z$ ], i7 V9 f! ~7 f int first = 0, second = 0;: i D% K I( L0 K6 [
for (int child : curChildren) {
I7 l3 E" K' b t! `9 ~' ] dfs(child, children, maxLength, s);
3 M0 {0 N9 O: a* Y if (s.charAt(child) != s.charAt(cur)) {
7 m- x& q- i& ^! H4 m a. T4 ~ maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
- O. I) t% d# z$ G if (maxLength[child] >= first) {5 d7 {1 p7 f0 O9 ?5 ]1 L
second = first;8 n& |) T; j/ t0 {0 w
first = maxLength[child];
8 O5 Q+ ?, o8 t1 x7 l } else if (maxLength[child] > second) {; W4 S2 }; Q r) \. h$ J7 Y- v
second = maxLength[child];. c- I; f! e( C* m
}
+ q& s- P. C6 L) Y7 }* J* e* T }
# E* m4 w* {6 Z/ y) P, R- p' j }
2 F' z! S3 P! H" ~) E res = Math.max(res, maxLength[cur]);
6 }% H9 K) O' Q8 W' [& p res = Math.max(res, first + second + 1);5 Y% \4 U! m$ \& a
}
& k, L3 ?& Y2 J. Q+ Z$ |& Y! K} |