登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转单词前缀】
1 A8 c5 g8 u# [: x, L
- v3 q/ ?& ]7 E% v4 |6 V' n' r& e解题思路- I( F; B; w! W: l0 ?
签到题。& a1 D! I9 N" a% |3 A! e
( ?1 c5 O$ I2 n: }0 x _
代码展示
6 h% b6 R0 o1 x0 x6 G, p
% l. ]5 u& u1 o" Q: F% Qclass Solution {6 L# K6 D: }& Q
public String reversePrefix(String word, char ch) {' u7 p: E1 i9 ]1 @ f6 I
int index = word.indexOf(ch);6 _; J8 i, l) h2 T9 s' l
return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
+ Z* g" S4 ^# ]% A word.substring(index + 1);( Z( k! f+ k+ o% x3 `$ U; d& a0 O
}
( ?3 g0 w! }. y& V6 e& y' _9 b/ L}
1 L1 S9 a9 `2 |6 v* j
+ k+ Z+ X b9 \# B8 K! t; D
/ i4 c* e) T( c! \: X: e
9 @: _: S- C/ A8 h9 F( M! u9 x
$ E* e' D% ?# h2 n) a y6 D0 s【 NO.2 可互换矩形的组数】/ n8 }$ r7 b4 i" |
B" D3 [2 [+ g- u% I; W5 Z8 L, R
解题思路1 F8 n. S8 L, x% X* C* d
将矩形按照长宽比分类,计数即可。
6 B# F/ A8 v/ r. ^& [9 p W3 ^) {5 M# f9 r* _
代码展示- C. m( O" Y* `/ ^8 [# x- e9 b
) X' ]! M- F: n# Q4 e6 n
class Solution {
9 A1 u/ L1 {' L, [ static class Frac {& O6 j# F+ b% J7 m% T" f* O
int den;7 ?- [, s q+ [, q+ Y# B; [
int num;1 @9 K$ `- ^& L8 U+ R
# \" U) B0 C, s+ |" g3 b public static int gcd(int a, int b) {
) H( H" L' ~ s% w: l7 W return b == 0 ? a : gcd(b, a % b);
0 y# M8 Q$ F) W7 d& d. S }. I5 }& J% z# @+ S0 ?
1 C2 y2 Q* Q2 J+ S# l2 V public Frac(int num, int den) {: Q& R# [. D( M+ R6 A
int g = gcd(num, den);
, E* t! @7 E# H$ Y; r this.num = num / g;
! C& q1 f# {& D$ n' |, D5 w this.den = den / g;! `8 E, a1 H( b$ ?, Y# o
}
* m( R' w" E' f3 q$ c% r% ~8 { J% `8 z, ] o- c' a
@Override. E9 i# ?4 v: n2 e( {; r5 Q5 B
public boolean equals(Object o) {) S ?: v. t) M) f% \3 Y( E
if (this == o) return true;- n U8 R( D2 i2 ?/ M
if (o == null || getClass() != o.getClass()) return false;
- S* k' h/ B1 T4 N, K Frac frac = (Frac) o;3 Q+ S5 l4 _4 b4 B6 M" W
return den == frac.den && num == frac.num;" U0 K4 g: H$ ]7 y& V5 y
}7 z( t+ B) }. Q2 m: H% J
/ C$ n( K- A4 \
@Override
" i4 v) B, \. G9 W+ r2 j public int hashCode() {
! a! ]( r/ U" p! l1 k- W return Objects.hash(num, den);
3 j$ f, |( }8 n" X; m2 i }
6 d; L# E3 ]6 P* w }% \8 K/ k: [5 U& ^
6 b" Z9 |7 k) b0 t7 a' a public long interchangeableRectangles(int[][] rectangles) {
2 R; B0 j: s/ J Map<Frac, Integer> count = new HashMap<>();
3 q' |3 }) y [- _$ X for (var rec : rectangles) {9 ]: m, F( y( A' i1 O1 d
Frac f = new Frac(rec[0], rec[1]);
$ F5 J8 A, s# y5 ?6 [ count.put(f, count.getOrDefault(f, 0) + 1);" e4 S5 Z; ?; H
}
; ~" C/ I; K6 f" M- A. m; m long res = 0;9 `3 D$ @6 h7 N' E
for (var k : count.entrySet()) {& y" w1 Q& ?/ s, c4 ~6 w6 a
int v = k.getValue();
7 @1 a0 e# [/ J- a, p6 M res += (long) v * (v - 1) / 2;3 j* w8 X* N0 t' D, C6 K3 x0 ~& y' ~
}( w0 a5 P. k' W( X$ }
return res;8 ^5 a0 j; x9 l* u' j8 ~0 b
}
! P' l; x( q& @ l9 w}3 w$ S6 r3 y: V; m/ k7 `9 s! Z" ?( k
B6 I; R2 |) n- N3 T7 h& P
8 [9 X1 a- t2 t. K【 NO.3 两个回文子序列长度的最大乘积】1 k h+ H0 _# @- \, v* Y+ K9 A, K7 g
1 c. b/ p2 |1 [; H% Y
解题思路
7 ?. @& K# Q; b* P. {6 K& O暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
3 ?. S5 d, M% c" r" \
- u. X& O# b7 z5 J: h代码展示
0 a6 c/ r8 s7 r* a% i P k( v4 X9 b: \7 A6 m
class Solution {8 i, U( I- _4 t5 E
public int maxProduct(String s) {) Y+ P) f8 S) H( u
int len = s.length();- p) Y1 ^8 B1 z! l
int res = 0;
/ p! y6 j$ P7 u( `; ^ int[] mem = new int[1 << len];/ R* ]6 I/ S' v
Arrays.fill(mem, -1);, T& o. c5 u. q5 ^1 q; }. ?
for (int i = 0; i < (1 << len); i++) { s( |$ j* B" ~5 h2 R" p
for (int j = 0; j < (1 << len); j++) {
( F1 q" U- X$ [+ i6 j# j. ]- H; M if ((i & j) > 0) {
7 d3 g6 f( {: r& ]# @. h6 [ continue;
1 u& o6 C$ J1 _0 w# x- c }
" H% z- J/ `/ _3 ?: m5 N( Y res = Math.max(res, length(s, i, mem) * length(s, j, mem));! _/ L: g% [# f8 p& j3 p; c
}- e( J; Z# s- Y, _* U
}
' I1 c0 f5 }, |. `( l return res;/ Q; ?: \$ [. {0 W
}
0 _( E; H8 m5 d) C2 G+ i* j# e% o3 ]3 S- d( b |8 x
private int length(String s, int bitset, int[] mem) {
% I; ~9 g+ q: y if (mem[bitset] >= 0) {& s, P p: g) Y0 r
return mem[bitset];
( q& U# z! e4 i2 U( J0 J5 f9 P }
8 j- N# Z' s' A+ P% Y: O mem[bitset] = 0;) t# V2 A8 N$ r) T& L6 e7 n/ Y
for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
3 \2 ]6 X$ O, f6 i while (i <= j && (bitset & (1 << i)) == 0) i++;: @& y3 @1 K" }8 g' N$ Y" Z
while (i <= j && (bitset & (1 << j)) == 0) j--;8 k6 W* M6 a3 _. R
if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
$ a" i F$ P* ]% _4 q) L j9 f8 H break;
: c+ H1 @5 E' b/ t" ]9 V }
! K% `# k3 w6 t2 w) v3 i if (s.charAt(i) == s.charAt(j)) {- E" y0 @9 ^4 h g8 d% C
mem[bitset] += i == j ? 1 : 2;
- |4 j0 Y! c% Q3 j: W+ f } else {
6 Q7 K% c5 z5 p& r- V" { mem[bitset] = 0;
& r& ^% z- n8 K( o3 A break;
6 {7 X+ a. }, H( W8 S }
* M+ t( Z6 r8 i4 M }
( t6 ^' d5 P, g* U return mem[bitset];
2 M1 L: u* q" j5 g1 F" G }
4 O# S7 o. G7 [' l$ k) p; b! R}
2 U9 w) X1 l5 y# V3 y+ p m+ P, p3 y/ s0 e
, m0 `% `* p" H/ f# X; s
【 NO.4 每棵子树内缺失的最小基因值】1 u6 E a) k* S, J+ W. J
& L# [" a$ L: x& y3 a
解题思路
; V Q% e; O7 G: `8 q& nDFS 合并 Set 即可。但是有两个优化很重要:
3 Z8 N$ y: w6 u5 v, f! q! m3 }/ j- _
1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
0 B4 _. d/ J3 d8 G; w* [
* F( S7 s4 ^: i- h6 ]& e- i2. 合并 Set 时由小 Set 合并到大 Set 中" I6 A. z- d! F* h+ ?. D4 J5 }
5 F8 j U( t' u( z) x& I% T5 g! _
_4 R$ X, |* d0 s代码展示
! s5 c" }7 c1 L. c
/ A* ?. Q9 s' {! @* dclass Solution {
, Z/ d/ h- i0 H' D3 i* U' K( p: i, J public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {
% u" I' r C& u0 H Map<Integer, List<Integer>> children = new HashMap<>();
$ l& h+ B) t( g3 z0 b3 G7 | for (int i = 1; i < parents.length; i++) {
7 d( Q9 [' {8 Y3 z3 e% b if (!children.containsKey(parents[i])) {
. m& Z% H, V* a2 s/ n5 [ children.put(parents[i], new ArrayList<>());5 T0 W) \3 `, v( w
}, e& j, y, ? \8 e/ ]
children.get(parents[i]).add(i);: g' @0 H! l; E7 M# l* y1 L
}: g. |0 Z, P6 b/ W2 {( q3 l
int[] ans = new int[parents.length];
9 e3 Z, K7 r2 J1 w2 U6 q3 f' L dfs(0, children, nums, ans);
- W( K- B& s; c+ k& { return ans;5 R7 r% X$ F F+ }" H& v
}, Y/ ^' S5 J# Q4 `; w
% K- p4 ^0 v& r8 t
private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {8 R/ k2 T$ z/ a
Set<Integer> set = new HashSet<>();
$ c- S9 J4 F$ L. { { set.add(nums[cur]);3 Z0 E0 `2 s$ U& i7 E; B3 X4 f4 O6 W
if (!children.containsKey(cur)) {
5 o" w9 \' `3 E3 r# \1 A6 U6 E1 c ans[cur] = nums[cur] == 1 ? 2 : 1;
& }: H7 Z% O% C return set;: y/ i1 u# W4 [
}
; u! w/ b. \0 D/ R& M var child = children.get(cur);
. H( P: w- h5 u: r& G* M2 v int start = 1;) s& x1 k# K! o8 M$ s& _5 C
for (var c : child) {- N. d+ l8 w$ r; Y( I
var r = dfs(c, children, nums, ans);
$ w* @4 f; l+ `6 U! H* H. P: | if (r.size() > set.size()) {
8 y, \1 i* w8 ]3 l. n* N Set<Integer> tmp = r;' {6 e/ k# E1 r* @8 e- p8 e% B
r = set;
8 ^4 b0 v& C& |" u: L3 }1 u set = tmp;
4 L1 ^- X9 y7 z7 y7 T5 | }
" a1 {) j: a1 ~8 w8 n7 ? set.addAll(r);
, P3 Z/ ?. E& V2 g9 Y7 X% g start = Math.max(start, ans[c]);, X! z7 Z, D! b4 K! q9 l' c* z
}# S3 o) s ]% A; s f! \ l1 W; z
while (set.contains(start)) {' V2 p* z+ \, Z0 u! B+ q% t& C
start++;3 V+ P( H4 _" a- }' Z2 k; T
}9 l& g/ M2 v! | f' t Q! e
ans[cur] = start;
7 M4 a9 m: l# p return set;# G* o7 N5 I: O' ?4 d% B2 b
}
, b, L2 F( y0 x# P" E}
# \7 D( ^1 X. x, q |