登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 计算字符串的数字和】
U/ o/ l& t; _/ ]1 z" d. o+ Q3 X6 ?, O# b' t& I/ d
解题思路% i) E8 V* v# q* w
签到题,循环处理即可。
! b4 u) i, {7 @# S6 T7 [3 |1 ^# V5 D% V9 l. d5 S+ n/ G1 c
代码展示
* p; X2 e3 s3 ?6 }+ i7 S- {1 B8 g: P( D
class Solution {
" t" u; y9 Z6 T) V' v# ]9 v8 x public String digitSum(String s, int k) {
/ I2 }+ f7 l+ n4 ?! D while (s.length() > k) {
5 V! H' z5 X* X5 S- Z5 V/ S3 [6 g StringBuilder builder = new StringBuilder();
0 r" _7 B- x0 E. t* L for (int i = 0; i < s.length(); i += k) {: M4 T% h% M% x1 [: v2 h, M& l* x
int sum = 0;
$ e- s5 a- f! K8 X7 P for (int j = i; j < i + k && j < s.length(); j++) {
* l2 A) X. A1 y: U+ J8 x+ e$ S sum += s.charAt(j) - '0';6 a i9 M# N$ O v* `/ `2 G
}. V) r+ T, m5 y) ]/ N
builder.append(sum);( @9 R+ T3 U+ G6 ?8 K1 D: Q
}% b; d: p& v( f) h' v: |' D
s = builder.toString();
6 k, ` F; M+ k6 r0 z, ^. R }6 I/ Q% g1 H' F- }/ Y
return s;
/ a' e9 D3 c. ?6 H) R7 X }) \* U0 l" N l
}# [2 Z2 G$ R$ O# w8 H- ?, p
& v$ f& F- s6 t4 ]
- Z! n3 x4 G1 a# U8 T【 NO.2 完成所有任务需要的最少轮数】
0 h: h" N4 r! V: O7 n
1 y. b. H! w$ B1 l0 ~! F解题思路
; r3 ?0 q9 z+ v使用 Map 维护每种任务的数量,然后使用 dp 求解。' `7 Y8 M6 A/ }4 S. u
& h& U# D* m8 Q7 [dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。8 o" }& u) Y* a" ^9 D) |* ~
) g4 c2 L) z. t1 M$ b9 @6 R
代码展示* d6 f: W% }3 i; ~6 @2 S
3 g9 u% F x3 zclass Solution {' V6 \$ f% g3 m: d5 g$ W3 N3 k$ i3 w
public int minimumRounds(int[] tasks) {6 l4 ^: i0 Z' Q# j
Map<Integer, Integer> count = new HashMap<>();9 p. r6 n" b2 P! o5 H8 N# Z! N
for (int task : tasks) {+ W; w0 [; A9 i& a+ y Y( q' }
count.put(task, count.getOrDefault(task, 0) + 1);2 U5 Z! `' t9 v3 {" T) g. P
}* Q0 @; ?0 p$ a! Q, X' R6 ?
int res = 0;3 Z1 y+ U3 ]1 m5 ~8 c' Y; \
int[] mem = new int[100001];7 e5 u' l/ h6 t+ D, X* H
mem[2] = mem[3] = 1;5 G6 m6 U7 D0 g/ ~+ J( X! F
mem[4] = mem[5] = 2;1 a q% l& [1 \. X) i* ~' S1 ]
for (var entry : count.entrySet()) {
7 e3 t( i& t' _: c" h4 E int cnt = entry.getValue();
/ d0 ~9 T5 \; W) z- w, n; U4 n if (cnt == 1) {
$ P$ q" o- s% ?" I# T# v: Y( C8 n return -1;; F- u) n- g f; u% F+ f/ V9 M8 e
}
6 t/ l% N" ]8 ~2 k# @ y0 M8 | res += dp(cnt, mem);- v- b, A2 ]' o. X+ d; \
}
, T1 q M* v0 }& B% U0 P& b& p0 ? return res;
% ?5 |) H" @+ n" D* B- c }( p2 y d2 C: @% b7 {6 q
4 ~% W, c: J) m+ B* p" y" ^; X private int dp(int cnt, int[] mem) {
L0 z Z4 o) p* U if (mem[cnt] > 0) {
; k& f$ D; r( k: H return mem[cnt];
& u! i4 J' y& N" i' G }& f1 ~3 A7 m8 }
mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
$ D" V: j. p; Y( ^" d return mem[cnt];% B# R) R) u+ k1 K
}; y9 e5 }+ z/ D6 s9 U- B: b4 W
}
' ~% o" H0 ]2 c
6 r/ x/ F5 F3 a, c7 Y& p* W
* v w: F1 y- [1 Q7 ^【 NO.3 转角路径的乘积中最多能有几个尾随零】' m% j3 |; w# X+ q: v& U: |
: } P9 c, i7 m* R* @" E解题思路
* k- p, U7 @2 s+ N$ r$ g; q尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)
: t% d3 T8 E0 Z" d; B1 C' x5 S5 P; k
6 p. q6 {- G& v代码虽然很长,但大部分是重复的逻辑,详见注释。5 \3 J; p3 G' z4 t% ~) j
5 J+ n* E" c3 E% R2 a/ _0 `" \
代码展示
8 s/ i) a7 y! J$ x2 o8 l% H; l. U5 x, T' A; x, \* X I
class Solution {) B( X' M# }9 H# j1 S$ R
public int maxTrailingZeros(int[][] grid) {* g n4 U1 z, g+ w
// up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数; \( m+ |5 G3 x& Q* @7 t n
// up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数6 r8 [2 ^1 P3 M1 d
int[][] up2 = new int[grid.length][grid[0].length];1 F, o5 c5 }2 C" M! K, |- @
int[][] up5 = new int[grid.length][grid[0].length];
2 _1 G4 d9 Y: r8 U; l% Z for (int i = 0; i < grid.length; i++) {
' z+ Y' B8 X( q Q P7 p for (int j = 0; j < grid[0].length; j++) {4 m3 i8 d3 @+ B# n# @
up2[i][j] = num(grid[i][j], 2);3 W8 A B# w" H0 h5 E! @
up5[i][j] = num(grid[i][j], 5);
! i- d s& Q: c2 s if (i > 0) {
; v/ }+ X( |' p3 N up2[i][j] += up2[i - 1][j];
7 G5 Q# @5 ` s. l& {: d up5[i][j] += up5[i - 1][j];
$ B" ]& w" T& \/ U$ h' Z3 O. k }7 N& n/ h" `6 m- s9 H' X
}
0 e2 K) q0 Q8 Q: v }
! S/ A* A3 ~3 U2 ` q" R // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数0 t: s) R1 a% Q1 A
// left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
9 Y% `. V8 s4 \ int[][] left2 = new int[grid.length][grid[0].length];
" c$ X1 Y" ]/ H int[][] left5 = new int[grid.length][grid[0].length];' Y1 S+ f7 q$ ?. m
for (int i = 0; i < grid.length; i++) {6 D! z: E- W% k. \" w
for (int j = 0; j < grid[0].length; j++) {
' F" J, ^2 G1 Q) L6 U' ` C; l left2[i][j] = num(grid[i][j], 2);" {3 G# }4 M, c1 i/ ~5 |
left5[i][j] = num(grid[i][j], 5);# p2 n# B( t* g5 }! p% @
if (j > 0) {
, } T& g, e; f, T& y \1 \ left2[i][j] += left2[i][j - 1];
+ h2 W! Y8 f% R5 C left5[i][j] += left5[i][j - 1];
- C2 l2 }3 a" A- K } f2 G) U b$ W" D7 l1 |' f- ^# j" N
}
% m; `, k5 A: C+ @ }
3 g% z+ P+ {+ i5 P // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数4 z6 h9 B" K* d- @, x
// down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数7 p0 r- f% v0 K. O% n
int[][] down2 = new int[grid.length][grid[0].length];( C- B; J" e; s: h2 r# B
int[][] down5 = new int[grid.length][grid[0].length];, ^3 ] F, b5 d3 u4 A( ^
for (int i = grid.length - 1; i >= 0; i--) {. ^! e8 O( |( o6 ^, |% H
for (int j = grid[0].length - 1; j >= 0; j--) {+ x0 m- l9 d. l! i% r4 ~ a/ Y
down2[i][j] = num(grid[i][j], 2);0 U) c1 ?9 c, @% i. i, L- W$ h
down5[i][j] = num(grid[i][j], 5);2 U1 X+ u W' K. I- n7 L
if (i < grid.length - 1) {$ Y& s0 s6 m7 U% i( u
down2[i][j] += down2[i + 1][j];4 }+ r1 N: ?; h A
down5[i][j] += down5[i + 1][j];7 t8 }# K/ g' D
}
- w `" x4 x# ^ ^* U! o* k }2 B+ {* o( D. m* O9 p1 ]
}
j) J9 a; G$ Z7 V! h% i. ^ // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数
1 e* u9 j' ^- o$ w2 o9 `+ q // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数; s3 Q" R' \. ]% \6 N
int[][] right2 = new int[grid.length][grid[0].length];/ o; w5 @4 S+ O. Y, R3 ?
int[][] right5 = new int[grid.length][grid[0].length];; u- n( w& k8 ^
for (int i = grid.length - 1; i >= 0; i--) {
6 g# ~, _9 p' E" u. m% g$ ^! I for (int j = grid[0].length - 1; j >= 0; j--) {6 }/ e) o9 H9 q' t$ v
right2[i][j] = num(grid[i][j], 2);7 s! O' h4 k$ l7 }. z( D9 X7 s
right5[i][j] = num(grid[i][j], 5);
' r/ u: O# W e2 l$ _/ o! g if (j < grid[0].length - 1) {8 I% `6 C/ O" u4 _
right2[i][j] += right2[i][j + 1];. b3 k! H; E* S1 I1 l# s
right5[i][j] += right5[i][j + 1];
2 o7 F3 S. x/ b+ t, T }
* c7 s c9 z' m. `! j7 \# q }
/ F. `4 b1 V4 T- d, r* [/ N; v3 u$ X }
8 S6 B9 ]9 x" G4 R) ^# L% i, g0 e' r: A
int res = 0;$ ?6 r, P4 x" A# e; t
for (int i = 0; i < grid.length; i++) {
. \, ]4 F% R5 L5 B" d for (int j = 0; j < grid[0].length; j++) {' I# R" |% ~& x) m
// 有四种转角形态
: S) q: g0 {5 ~- u8 w% p // 1. up + left
( @ F& ?" ?# b' n if (i > 0) {
' _3 Z7 ]5 H2 Z: }6 F& ~1 ^ res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
/ O1 a" m& L1 f. ?" F }
2 {& U2 @. [! m // 2. up + right
6 E+ K- q0 \, D) ]% O( e if (i > 0) {
! S/ O: \ A, Z res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));
- w+ C8 k, |5 S" P" h }; T& y" x X( p. j) ?' P* p! g
// 3. down + left
7 J/ n7 o& j1 v9 v% G/ B' ~ if (i < grid.length - 1) {
1 j, W! K; ^/ O' M' k% c res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));
* |+ `7 ?, ]: ?, X# ? }
' p. s1 K1 R2 i- r5 Z$ P // 4. down + right }4 E1 ~4 _ o* O% Z
if (i < grid.length - 1) {
1 {7 k1 F' c+ w, v2 o res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
+ B8 a6 Z2 k' p' K% E, O* j. ` }# @, u, _# ^* V# `. m+ ^0 E( j
// 不转角
( ~5 I$ e' i( U% [ // 5. up/down/left/right
# _) {) M6 V9 Z; O2 f8 h- v( ^" D& M res = Math.max(res, Math.min(up2[i][j], up5[i][j]));7 @/ e7 D1 ]5 \7 H/ b E. k6 H
res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
: Y. }/ A0 A. Z) [ res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
; F# g5 U' M, A# |/ M res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
8 J4 j" y; ]6 o: w" g }8 X1 t$ X+ J* _8 |* U
}
6 {- |( b8 I1 } }1 Z return res;
- W/ r' {' k o }
$ Y \4 r7 H" d0 |" q! L( d! e9 P. g
private int num(int x, int y) {6 A7 i$ ^" ~# a5 n) e
int res = 0;
; ?+ z. [. C0 _8 D while (x % y == 0) {
! C Y U+ |! w( C% @9 m9 f0 }- N res++;
2 i4 W, x+ @+ ~7 g. K x /= y;
; p+ u6 {+ M9 u }! ]; d& B5 d6 T/ W7 E- j6 \
return res;
3 T% |7 h! r2 U: k) j& c. T }. N$ d+ C5 H( I# Y; t
}
0 Y8 J2 ^/ a+ o) ]" c$ Z1 y6 Y V8 C
【 NO.4 相邻字符不同的最长路径】
) t# M6 ]* B* f W$ q# b5 q, U" m! ?& X% Q# a2 X
解题思路
* c( n5 B3 X/ [: n" P. h" R# c求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。4 I+ x3 @0 i! R% v7 E, |
1 t/ J+ n8 O4 `% ~& ]4 a
代码展示
" o( N, _9 {" N
( c. ?: G& V# B, Z( C3 xclass Solution {
8 m# d! \4 d' m w int res;
8 W+ G' O% |$ i8 q. }
. j1 ?- U! D+ D public int longestPath(int[] parent, String s) {+ d' C, w* X6 C+ @. b t1 Y+ |* K) _
Map<Integer, List<Integer>> children = new HashMap<>();
- h& ?7 }) Y) E for (int i = 0; i < parent.length; i++) {
3 Q7 F/ O* N) M/ o1 {3 t1 v if (parent[i] != -1) {
5 s6 G; G/ f* I7 N" Y* Z9 r. f if (!children.containsKey(parent[i])) {+ _& ~1 h. O: {, \8 r
children.put(parent[i], new ArrayList<>());
m* u9 i2 K. d# @6 e, Y }
: M5 e7 ~4 G' Z: M# q, W children.get(parent[i]).add(i);
3 {% W( @! I! y0 C }
! S4 r/ d+ E8 p$ p1 ` }
$ n: Y: v; v. Z: Y: o2 S5 q- }' L5 X( v9 b7 X* j; R
int[] maxLength = new int[parent.length]; {6 k% B) o% d2 w2 l5 L c+ g# ?
res = 1;9 {0 i3 ~7 `5 G$ C0 J% w
dfs(0, children, maxLength, s);# `- Z$ `' {, R+ |8 N7 N
return res;
( @3 a" X+ J; d, k }$ o1 P0 `, D' Q
9 e7 a8 v( f. v3 r* c' o2 g9 O& r private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {6 S! b! l% m" K: ?
maxLength[cur] = 1;# I* D! J. f) o+ m/ V. l
if (!children.containsKey(cur)) {
0 {% }: y0 V! ]8 j return;
6 z5 j" e; B$ d9 ^# | }! A: m0 G9 a+ w) v, }: v
var curChildren = children.get(cur);( ?; c# w1 Z# X* T0 {' x
int first = 0, second = 0;4 Y4 l5 T% E0 v4 ^# v& L$ e# @
for (int child : curChildren) {
l! ]7 ^, K9 U dfs(child, children, maxLength, s);5 c. a% Y+ C" w8 N( r: U% }
if (s.charAt(child) != s.charAt(cur)) {
4 A- o* k9 C( q! z1 h' z, D6 Y. b maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
2 I4 R I. K/ N' w if (maxLength[child] >= first) {
( I6 x6 z# ]+ B( |0 V second = first;8 a+ `/ S6 ^, w0 d- S/ n
first = maxLength[child];& r# H, r, D6 h9 n7 S' g1 T
} else if (maxLength[child] > second) {
7 b& C [' e9 P6 ? second = maxLength[child];
" {; F1 r' ~5 Q6 Q: L }
! i9 j3 g* T q1 f8 v }9 f) t2 r/ ?, x3 u
}9 q% r) ], n7 S! d- j2 V
res = Math.max(res, maxLength[cur]);
) V3 Q% H' e2 n res = Math.max(res, first + second + 1);1 F$ Y$ s5 b. s; V0 s
}
. T( w* d( q* G9 k: Z1 T# j} |