登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转单词前缀】5 l( I3 W2 d _7 }
& N4 Q6 ]: y$ v$ q解题思路% f! E) E' P! E3 J9 ]/ i6 G* C
签到题。7 J2 b, M' l3 E& S' d' U
7 p* `/ L/ `0 A. q
代码展示" `6 Z' R' |% C$ p/ }! o; B$ v
9 Y/ I0 Z7 }. R) D; r f
class Solution {( _) _# P; a* j) b( Y
public String reversePrefix(String word, char ch) {4 C6 ~; v: [( b1 R
int index = word.indexOf(ch);
+ H# A( f6 B0 b+ A return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +0 j( G) B- k3 }
word.substring(index + 1);
L2 @5 P4 h2 C, d: W }0 ~# o+ Q* q; Q1 E8 j
}: \$ W: C6 w2 z* t8 S
) }: w& J0 |0 V# p3 J; G
s7 @7 b, c% Q' G& ?7 O5 m7 Y5 W" O5 ~" l
& k9 e* b# R8 {: n
【 NO.2 可互换矩形的组数】
# a; K9 e7 P, a& W& a
7 S+ `2 Y" w# m解题思路
- J* G3 i- _, c0 b) j9 b将矩形按照长宽比分类,计数即可。
# n G: @ y: K. r G5 ]: P1 _1 k
代码展示
5 R G7 g5 E" R
3 q. h( A8 a( H1 Q5 w/ h" Qclass Solution {
; O8 a$ I% Z- e5 I% t static class Frac {9 i, B' H' W$ Z
int den;
0 c7 j& M8 N5 k int num;
! L x$ W* ` D5 F' B" @2 j3 m
" r8 ~7 N5 {+ P$ ?3 c- { public static int gcd(int a, int b) {+ X$ n0 J% b" v& v+ M$ W' K
return b == 0 ? a : gcd(b, a % b);
! q9 I, o5 }0 M' r7 c }' K3 J( j {5 U, V7 L9 @9 _- t
2 F% G. Q4 ~3 H# V7 Q0 U8 ?% ] public Frac(int num, int den) {* C* U J. m) w- o
int g = gcd(num, den);
: B/ x' i X/ ^ this.num = num / g;
' R* i# |6 H' v- o6 b this.den = den / g;* R; m) o, k8 D) J# y
}( ~- _) K9 _! t2 x( ~! Z
- z( x) k9 J5 [# ]9 z) U
@Override2 G. L/ U) v9 N7 R
public boolean equals(Object o) {
. l" N7 N& U' q, x! s8 G/ L" W if (this == o) return true;) N1 _8 Y/ Y, B' g+ k ]" x( O- p( }
if (o == null || getClass() != o.getClass()) return false;" R4 N7 [* U3 Z6 U
Frac frac = (Frac) o;
: T9 K1 n# _ |0 J d return den == frac.den && num == frac.num;0 ]# ?! r' l/ f+ o- c r
}+ C4 ]/ ^/ v; G# w- r
' e& E5 z6 e$ Y) M( T @Override
$ Y" B- M7 M0 I6 q4 k+ n public int hashCode() {
0 l/ I" y' z' H; g return Objects.hash(num, den);8 u2 p8 u$ f8 O8 j4 a
}8 l, a' H, ]/ a7 D" x0 ~6 q1 m. W
}
$ e3 s% l* q2 R. d0 `' b
4 s, Z2 ]' s1 @$ \: }" g+ ] public long interchangeableRectangles(int[][] rectangles) {
( P4 k ]( Q8 N Map<Frac, Integer> count = new HashMap<>();9 l% H$ T( A! J/ Z7 u9 u; e
for (var rec : rectangles) {3 n0 l2 C# ^' g) S9 @
Frac f = new Frac(rec[0], rec[1]);9 ^2 ?% S, [+ t
count.put(f, count.getOrDefault(f, 0) + 1);
/ n* I3 E7 n3 K8 ?8 f5 }( B* s }: N) c& z) p8 Q4 O
long res = 0;+ i; x/ U1 T- [0 c( z! p
for (var k : count.entrySet()) {) g' b7 B# l7 {: i3 X, ~
int v = k.getValue();6 v* Y* A! C+ U- m0 u! q
res += (long) v * (v - 1) / 2;
/ x2 \: Q1 |! @- `* @8 m# z }9 h/ u3 U" u% t5 ?) @
return res;9 U8 }/ d5 ^ n8 t/ Q/ f
}" ~7 W4 E4 z8 W/ Y. Z
}
( }4 H! ^& O T& Y; j4 p5 K6 n# d* }9 M" y
% s, b% n( [7 C$ K【 NO.3 两个回文子序列长度的最大乘积】! e: W9 s* ^0 N9 y) g6 L2 n u
4 N M, E- E% z5 d6 c0 q
解题思路. [- o7 O6 Y3 O" i) j
暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
" ]2 u: o* I/ s! u9 Y/ ]+ D' j) n# g* `* D
代码展示# t8 \/ l! o. \7 l `8 v: `9 f
* O1 ] Z9 z4 E5 }& M6 vclass Solution {( j1 [0 h: C6 @! J
public int maxProduct(String s) { a* o q) w8 ]( j2 X. d- Z2 e0 l8 O' I
int len = s.length();
) A2 W# e$ E0 y( Y& K int res = 0;. Q% t6 T* s/ S- T% Z
int[] mem = new int[1 << len];$ X6 c# a& Y: P1 v
Arrays.fill(mem, -1);! h9 J) ~3 T0 y! \8 Q7 e7 M
for (int i = 0; i < (1 << len); i++) {
1 ]! S7 a4 l) j) n* ]- l for (int j = 0; j < (1 << len); j++) {# X0 p% t8 T: r4 j. y1 Y3 F
if ((i & j) > 0) {7 l4 {3 s. [! T( D0 }
continue;5 ^# [. J O: J1 Z( F
}! d; s/ F0 P! I
res = Math.max(res, length(s, i, mem) * length(s, j, mem));
$ h3 h3 d& B- M* g: C# s, h0 F. m }* o9 Z7 [7 |& K& L, S. M- z( O
}
# b2 k. V' `* d1 [# ?. k return res;2 d9 P* ?) S3 n* O
}3 `# v" h# f% H* G" r+ f
- T) n# ]% j7 ?8 b) O+ ^0 t
private int length(String s, int bitset, int[] mem) {
0 c$ W7 o9 V+ N3 H# c if (mem[bitset] >= 0) {0 A. t3 R/ C& a9 H$ [$ r1 f
return mem[bitset];2 C; l4 `3 M0 H: i3 S: V+ H
}
0 T' t2 j7 h5 g6 C) P# _ mem[bitset] = 0;
# R2 D. b- g' T0 o5 _ for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
9 P4 F0 e: z4 F9 ^ while (i <= j && (bitset & (1 << i)) == 0) i++;, I- u" t; r7 G V4 _/ R
while (i <= j && (bitset & (1 << j)) == 0) j--;
0 q- M( x4 k+ z) r if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
: k. O/ r- J. r% D; W' ^4 ? break; K2 A8 N$ D! J c
}
: t. e* `6 ?/ w0 s if (s.charAt(i) == s.charAt(j)) {- \2 w- f; d/ s' ~& N- r
mem[bitset] += i == j ? 1 : 2;
% \. x y% y) v+ n2 h% Y% T& P% l } else {
+ w4 D( n1 K4 N5 P1 [. z: c mem[bitset] = 0;3 v5 }$ L3 L- S
break;
S# W1 T- ?" z- W- \7 @) [, M }
: q$ c. V9 ~) v3 }$ b }& K. u' }- M9 J, j0 K
return mem[bitset];
5 |- c$ X7 {( H; t* m' U }6 f" q' J. @' t# p2 A: x0 x" i( m
}/ k, H' j/ C' V. E8 D0 r
# t. x& b. `9 q5 z! {; ~, ^) ~
& r C0 ^8 l P) D! ]【 NO.4 每棵子树内缺失的最小基因值】
' }" `! A( q1 x# @
, w& I' O$ F0 K- d3 E8 `) S解题思路
* B+ d. H, J8 ?' EDFS 合并 Set 即可。但是有两个优化很重要:6 N( k9 S0 P$ X9 V/ F: }
0 `# ~4 ~+ h' x5 X- g; t1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
# `* l5 T2 m/ w8 i5 k% R8 u2 L8 t4 G- M+ R6 ^5 ]
2. 合并 Set 时由小 Set 合并到大 Set 中
; K2 l+ Z, N% j+ y- G: v* B* t1 O( p! P) j
+ d7 ?1 O. E$ W8 I3 l
代码展示, L9 D) Z, o8 U, m" S
8 Y5 j( `& Z1 d
class Solution {
9 X" \ K* c- N7 H0 y public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# J: L7 K8 b0 e8 X* f
Map<Integer, List<Integer>> children = new HashMap<>();% P, x+ L: m1 s+ c7 b
for (int i = 1; i < parents.length; i++) {# b$ H$ t, `. W4 L7 n- z" d( S
if (!children.containsKey(parents[i])) {( N4 i2 f( \# O4 {* N1 i! P
children.put(parents[i], new ArrayList<>());6 _& E5 H" u& G0 f1 B1 G- q' O
}$ Y2 l& f4 E0 s: d3 h1 n& [. x
children.get(parents[i]).add(i);
7 u) @* J: F/ B; G# k9 l }8 m# w: Y% @$ v/ k7 X3 a+ X
int[] ans = new int[parents.length];- R5 _3 S X1 L2 u
dfs(0, children, nums, ans);
: G: L2 P' t |: } |( P) R" z return ans;
; R8 S2 O0 c X8 o4 ]3 { }
o# L' V& Z/ T; A; f. }# N4 y: @4 a
private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {
- n; F8 T% ] J* `" B; L P Set<Integer> set = new HashSet<>();
6 F7 m% G# l) K set.add(nums[cur]);' o7 r3 j9 _" U' \# J. B( ?6 k
if (!children.containsKey(cur)) {* {6 R# Q6 Z0 l, @7 q
ans[cur] = nums[cur] == 1 ? 2 : 1;$ ^& L+ e$ X5 h! d# d
return set;2 G% W* D4 Y# g" o/ j: m
}0 N6 W/ e, [4 W q2 M
var child = children.get(cur);
; g1 l* Y! [& Y% Y% } int start = 1;
# R1 Y S' L0 U! p5 T/ t' L! J for (var c : child) {
4 q( j. Z7 x7 S& C var r = dfs(c, children, nums, ans);
' f, j. u+ Y5 j1 g if (r.size() > set.size()) {
6 a/ t- G8 b" x" { Set<Integer> tmp = r;
% N L$ `8 i& z) R7 G; ~ r = set;2 Q; {. _- |& u
set = tmp;; ~9 |6 L; D* w: v& L6 `3 N
}1 Z$ r# ?2 c. N! l9 t
set.addAll(r);, c' }! f$ ~) P* C# n( j
start = Math.max(start, ans[c]);
9 _# t+ @) w( P6 Q# `/ v }
, Q& w* A; o$ X3 F+ l while (set.contains(start)) {
/ `, d: u/ L# g0 A% a5 J& b4 Q start++;! h: U" N, {) e$ f7 s
}7 _1 _; @) X2 u! E; H
ans[cur] = start;: ^- x8 b4 P. h+ e5 c: Y. ~3 j
return set;
3 U2 d: Z( d1 ]+ V0 w9 y }
( ?& `; w/ V: K( @* \6 T}# k% L9 G+ l* M3 |% n
|