登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转单词前缀】1 C# l* b& R0 b# Y s& s
8 S' G8 w) v. y9 J0 \% L( @解题思路
4 m+ f9 H$ J% u签到题。5 T3 G3 n9 B& F1 @
% v! Q* ?) }1 K8 S! z代码展示$ X) F' B1 k6 o/ k4 a) Y
) e6 p; e) H; Q
class Solution {
: o6 g1 {) ]& \/ e7 V. L( ]- a6 L public String reversePrefix(String word, char ch) {
/ P f* ?% h0 ]3 J# h: j int index = word.indexOf(ch);
+ S( X6 j) I4 @% ^" O5 ^0 r' _ return new StringBuffer(word.substring(0, index + 1)).reverse().toString() + r( I; E( u3 j5 R0 ]
word.substring(index + 1);
1 a5 A9 W- Q* p* D% _7 K* q) ?% J } F2 p5 B5 t+ O7 U( i
}
6 V: M1 }8 P6 l( s
% ~3 a0 B+ c) d! h! |3 f* i5 ~' D3 P8 s9 A
) |- _9 X4 t% \& j2 W% U" P6 z' |+ y( Y7 \% l3 h( A
【 NO.2 可互换矩形的组数】$ C/ f! k. d4 H1 I$ x$ g7 V& A
& g+ }% i4 G$ h+ v5 E
解题思路
' ~5 f& w4 P5 M0 h; `/ }. U1 ^: Q$ F将矩形按照长宽比分类,计数即可。. ^. x8 F2 g" _8 X, e7 u c
% y, I3 O b0 W& `: Q
代码展示
% v5 m6 b, D# d7 g0 _6 `2 M( P: v( J4 b
class Solution {
8 P# @) Y( e5 H5 ^ static class Frac {% H5 g+ \2 L! @9 P' R# k$ D. T
int den;: u" a/ s! Z5 ~0 S
int num;/ C1 F- C7 Q/ P! b# a2 A
3 H: y1 ]. v0 I
public static int gcd(int a, int b) {* F9 S/ W* |9 N1 I7 r* A0 H7 {) h
return b == 0 ? a : gcd(b, a % b);
, U7 B5 |2 n4 S- c% D }; S- I2 v+ ?# x/ k
# H; ]. z& w$ Q$ D1 a
public Frac(int num, int den) {" V2 \: ^0 R- D
int g = gcd(num, den);
9 O" B' X4 R: e& J, @2 O. h+ V5 ` this.num = num / g;/ f# }! [# V% V# o6 A: t6 i
this.den = den / g;
5 k- N) @" k' B0 ^+ F }
6 {3 a$ h/ w$ r4 N. X
2 Y9 G2 U" p! x @Override
5 K7 h% g( j& F$ w public boolean equals(Object o) {
/ p ], e% x* i if (this == o) return true;
! [/ A. W$ M0 D( G% \ if (o == null || getClass() != o.getClass()) return false;
: G: x& q) f4 Q$ `8 r Frac frac = (Frac) o;
1 l. n: F4 B7 b: e return den == frac.den && num == frac.num;% N# [8 q; P- f7 D
}
0 Q \6 {1 h( T1 c* D; k- Z0 t7 |! T1 D3 d1 W6 W( t% |( [6 K9 A' ^
@Override, G1 j( M' t* R+ w: }+ S# ]
public int hashCode() {
8 ^4 c l) ~$ E# T2 ? return Objects.hash(num, den);, V" i' J( b# x5 N* p7 x
}
. a9 k1 t6 Z$ A* r* C' o3 p }
+ ~/ b2 c# a1 D( q- }) w/ Z% n1 _
. q5 ~9 ^5 i: ^2 y, z) I, E public long interchangeableRectangles(int[][] rectangles) {: O( Y" }& V8 l3 E# M0 X
Map<Frac, Integer> count = new HashMap<>();
: h+ [/ q1 U. o) ~ for (var rec : rectangles) {3 J+ y# _. c2 G
Frac f = new Frac(rec[0], rec[1]);$ L0 w; p& O5 A* W' Q% c
count.put(f, count.getOrDefault(f, 0) + 1);
+ R0 U R3 e- V }
& ^9 |. R. q# y4 r. o4 W& T long res = 0;
1 n2 r4 ^" R3 g; {1 H, h$ E* ?3 ~; G for (var k : count.entrySet()) {
$ B) g% l" U0 T! S1 V) B X1 X int v = k.getValue();8 `2 H* ~" i& ]
res += (long) v * (v - 1) / 2;6 ~7 |0 z" r# b, w( d) k# Q- x
}% ^+ g5 n) T1 d) ?5 b
return res;& }' H" w# _7 @) G
}: E: ]9 J W$ h2 w
}! ^- h, ?# K! [/ q
1 c# s4 L& E+ h: L/ Z
) I# s9 a# J8 D【 NO.3 两个回文子序列长度的最大乘积】# k% g' }0 O8 S" {: \+ ~, `
$ n W" k) m3 m6 D* S2 i% ^$ R2 ?0 }解题思路8 h6 j# L+ f5 A8 L% c
暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。! S) @8 b$ p* r+ {# M8 z( Y
% S& N; o9 o* p. E1 k( S" D代码展示4 C+ v: {6 n1 L: M
% j( n: I6 I2 o* ?5 c- X
class Solution {) R$ Y$ J/ K+ o( E) c4 ]
public int maxProduct(String s) {0 n* Y1 m" n; g: Y9 U. J
int len = s.length();& i% M9 b6 A& E4 c0 Y5 X O* H
int res = 0;6 M9 E f+ d* ~2 Z: J$ e$ q
int[] mem = new int[1 << len];
( C0 ~7 Y1 Q" E G9 C p2 X Arrays.fill(mem, -1);; }& d0 X6 ]! k7 \4 s
for (int i = 0; i < (1 << len); i++) {0 k5 ^ Q. B& F1 {
for (int j = 0; j < (1 << len); j++) {: E+ b3 U8 L9 s" X; v2 p+ C; C
if ((i & j) > 0) {2 Q: |4 _* q! w# P2 s4 f N
continue;
: F: t4 {# q/ ^9 @+ u( d }/ C2 r2 E" N! f+ b
res = Math.max(res, length(s, i, mem) * length(s, j, mem));% h! o- P/ g3 f9 h P# D5 i
}% N9 R1 s. m. Y* n* S- K ~' y" a5 r
}
1 N! T6 `( `) C* l! x3 T return res;
6 h }& w6 R, U# F7 g( M$ R }
[4 N1 v3 K. [1 |& D, x' U5 C( w* ~. T2 y: Y" ~9 r6 l* N
private int length(String s, int bitset, int[] mem) {
9 i6 z$ r, R5 b7 h' H. @$ { if (mem[bitset] >= 0) {
$ ]8 Y, u9 q) @5 ~6 K return mem[bitset];. w, @: L- G0 c: } _. e
}
7 F/ ]+ m/ o8 _( } mem[bitset] = 0;
4 o4 C* d8 ?- c0 c; F for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
' n/ [) ~& ]/ V( c" X: g6 T while (i <= j && (bitset & (1 << i)) == 0) i++;
0 v3 t% [" _! \, D9 t/ ^3 { while (i <= j && (bitset & (1 << j)) == 0) j--;! }0 l0 o8 t3 k5 A6 X0 o5 Y& f
if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {" R* z" v; Z9 r( K/ f8 @
break;
/ V2 ]( L- q( Z7 }/ S- s }
* \; B; w: m2 i/ d if (s.charAt(i) == s.charAt(j)) {
Z% D# G% r' p) g mem[bitset] += i == j ? 1 : 2;! J# m8 ]) S7 L7 K$ f* t$ Q
} else {! V2 f* a3 l r
mem[bitset] = 0; A5 O) B( T( L2 Y( R6 E/ N
break;$ S% H! U1 W; I: H2 J
}" Q! J( t6 K' M* B
}7 d% X* d& l) W, b* k
return mem[bitset]; l0 }! K+ C: \" [$ `* o, H1 p( j
}5 [) F/ P' Z( I9 f$ a. c4 o
}
# b. U3 b0 p7 P( f7 H" @. ]( J& X0 H' r) ^ i8 v
, M, h+ l; |; M# ?! i' L" \6 F
【 NO.4 每棵子树内缺失的最小基因值】
4 w1 ` Y0 t2 K+ \! p
O) y2 I! P9 |4 U% C) ]解题思路9 X- g/ P5 e! O, _) ^4 J
DFS 合并 Set 即可。但是有两个优化很重要:* q4 V" r& u7 m$ X. k
4 ^% I# _' c; X4 ^/ u1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 18 f, q* A- N7 Q O# I
3 z% G* }* J9 ~9 u' h2. 合并 Set 时由小 Set 合并到大 Set 中. N T8 {( m6 T' y/ @! l- a9 s& _
7 a0 u4 Q$ C' E1 J9 O, u
! h& W6 z# u0 t( p" @; O代码展示) b$ t, B. ^& Q$ F
* e: m4 E: A0 W3 Tclass Solution {$ j k5 s! o; W5 s3 l; g- g4 i" X
public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# K2 M( ]2 {; w
Map<Integer, List<Integer>> children = new HashMap<>();
N& e2 X8 X) m" Q p. x L for (int i = 1; i < parents.length; i++) {
# z3 G$ k# O; p6 c: M3 ] if (!children.containsKey(parents[i])) {( W# v& }7 Q+ C/ K5 d
children.put(parents[i], new ArrayList<>());
H: p7 E) o% Q) O. Q }
, Z" c3 i% H' _, g* U children.get(parents[i]).add(i);
, R( p: S% @# i# K }% j: n9 D6 f7 x2 g7 V, X' f
int[] ans = new int[parents.length];
7 w8 H+ Q+ Q) y dfs(0, children, nums, ans); v2 e* r( V9 e' o
return ans;2 Q$ }" y& w/ x2 J0 G
}
' F! B, u' M& F2 S1 X. r9 ?' P- H4 M' H
' D3 v h! p; t5 b private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {# `/ C1 P. F% T0 f/ i1 Y* {6 ~
Set<Integer> set = new HashSet<>();! E' K6 S$ {$ i
set.add(nums[cur]);+ X/ @2 O3 I5 ]( N X6 S" P9 d
if (!children.containsKey(cur)) {0 j l% c! F/ ~( X
ans[cur] = nums[cur] == 1 ? 2 : 1;
! ^) D! k2 s& L, H, R9 E% X return set;
. \8 B' H/ k- h) y5 O. C }
* }& W! [. p) |- Q& Y$ G' G var child = children.get(cur);6 @ M/ o- j; j$ r
int start = 1;
9 b- B6 l4 @7 S for (var c : child) {0 _, h* w1 t9 f# F# z
var r = dfs(c, children, nums, ans);
3 C4 N7 A' ]4 O6 x( m- Z4 K0 T if (r.size() > set.size()) {' L6 F, k% w6 X! j$ @9 Y1 J
Set<Integer> tmp = r;
( t1 j ~3 Z% s4 U r = set;2 `% N8 {' u, C$ _7 p3 R
set = tmp;
6 @( R) s2 R2 z' p; G" B }
) W9 R; Q4 d% C" i4 F& E set.addAll(r);
; c0 e$ v' _8 H* |! T9 n start = Math.max(start, ans[c]);6 C# T- H% O7 k' w' G! n
}
]5 v2 r: T9 a y" H* b6 y while (set.contains(start)) {! F: Y" q: a7 q2 F; W* s
start++;
8 }4 Y! P6 [: E% i5 x& l }* r* c! s, H: K+ l
ans[cur] = start;" Z: w+ h! G5 ]3 v8 S" \0 I
return set;
/ t8 {$ {% X0 t }
u8 B, r1 j2 b}2 n8 `! j+ Y7 y0 Z2 c; j
|