登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转单词前缀】2 d v0 m. ^/ @& Y* @
" n) y: Y! q- f- t9 D解题思路
" z$ b" ^* q7 X4 J" p签到题。9 M' V6 }1 e% ~
' C$ @% D8 ^" @ O/ B代码展示 C) f& [! r' _/ R; H1 t2 Z; x" U! ]
: Q* I6 P9 K1 Z( j9 i" T3 }8 V7 Lclass Solution {
7 i: K: L9 x- a" k4 m public String reversePrefix(String word, char ch) {' }+ c$ ^; B: D O+ b& q' J T
int index = word.indexOf(ch);
+ f. D% j# T) H7 X. G7 M' Y return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
2 _; i2 N% v4 i7 H- s& F3 I0 h word.substring(index + 1);
! B) u9 r- p. m5 o$ k& ^& s7 [5 E: a }7 P# a0 w# Z* h! Z2 e* i
}
7 D0 A6 M1 D0 r+ M- E: z
~ ~" A% _) l7 C
3 ]3 K3 V4 m/ { w. R( F0 z* {0 Z* Z5 _" N# N3 i0 w$ ~: O1 ^
) D, a- o, d5 \$ ~0 z【 NO.2 可互换矩形的组数】
) W, u0 \0 w n) k; v, T6 g' _7 H4 U2 t: O- I: W! E. G! k; D
解题思路
6 }6 q0 \7 G! ]+ I' |将矩形按照长宽比分类,计数即可。
3 K% L# c& j+ {; _8 Q6 t0 R
6 G# H$ ?: V5 f: j; w6 ^$ n代码展示
* a/ P' ]$ Y& Y; @* r5 j( L
0 s+ m7 a4 ?( z1 e1 Z1 Wclass Solution {/ _9 k" {2 z1 D
static class Frac {
" P! A- m! B; Y5 {# ~ K! p int den;
; U4 ]& I7 u) j int num;6 e- |/ I1 F2 G+ |4 p5 b
W% S& n" `% i& k& d, L0 |$ ] public static int gcd(int a, int b) {
1 s4 N8 l$ m4 s% q return b == 0 ? a : gcd(b, a % b);9 E2 E$ ~; F0 a" U: y
}
6 ?. E* V7 m% ^+ M5 [+ c
* ?9 s4 V) k: o! R+ W public Frac(int num, int den) {
* `9 K0 T! W' J/ a* @6 S( [! ?" ^ int g = gcd(num, den);
1 K0 ~' X' `5 F7 _' t2 b) o this.num = num / g;, B& C& ^9 Q3 `$ a
this.den = den / g;. B" j" X" ^' w9 H- Z* Y+ L
}
: j& {" x$ \( S7 N* _3 x2 Z7 b# |2 i. ]2 v V+ O1 v6 ^
@Override
% t' r, u m( l! U public boolean equals(Object o) {
6 O, h: A4 }4 j2 V) V, Y$ y/ ~' o* j# J if (this == o) return true;6 f) A+ y- l% W" u; t
if (o == null || getClass() != o.getClass()) return false;
' C7 w+ ]; |7 S# S& U* n Frac frac = (Frac) o;
* q* J$ G; [1 l. Q return den == frac.den && num == frac.num; y6 g6 ?, I5 O! S5 ]8 a" p
}0 I$ Y c! B1 W$ s A5 g
" H$ R# X8 |/ n# P* @; l @Override
' e# R1 I: O9 T# D P' v public int hashCode() {
' ~2 }* N: Y7 ^" @& F# \ return Objects.hash(num, den);
. U) ]* x5 x- b2 Z# e5 ~2 i }* ?( v- A0 W3 D" N3 {! G
}
. e: P/ e! b4 s5 ~1 `2 {6 f) ~
& H* F! X" t' y4 N W) `- @5 o public long interchangeableRectangles(int[][] rectangles) {$ t6 B) n: j, e4 L% \# o# M
Map<Frac, Integer> count = new HashMap<>();
% [1 b* D/ A, C/ A c for (var rec : rectangles) {
! O0 V2 Z( Y( Q Frac f = new Frac(rec[0], rec[1]);
. ]3 \; z# k! S) X; U) G9 y4 { count.put(f, count.getOrDefault(f, 0) + 1);
4 k* `1 c0 {9 `- h" ^: I }4 L8 P% b# v$ C
long res = 0;/ t# f9 |( u/ b* a k
for (var k : count.entrySet()) {
0 h2 r; Q5 h$ k# ~; Q/ o0 O% D int v = k.getValue();
$ M/ }& U+ v" h& k; U" B* v) F' P; g res += (long) v * (v - 1) / 2;
2 G: [2 P) D+ A$ y* [ } T! b% O( P2 ]2 N8 t# a6 @
return res;3 U, A2 X/ r: U9 ]7 \& a' w% _" l! p9 O
}
* m' L+ y) u+ U0 _4 l}& i6 p) J" y# p7 y+ k
7 p$ S1 Z* |0 }2 _) k. q0 c1 H
& h; b2 g( K: {2 @" Q: a9 e: Y
【 NO.3 两个回文子序列长度的最大乘积】
8 g6 G: G5 m7 U; }- W
; e# ~) U9 q- G3 n, G+ n9 [7 j解题思路
9 v2 A4 r' q- B. W暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。
) M2 ~6 ^8 k% X8 C: T; F: \8 x! {( Q; S+ E# M5 y+ \1 r
代码展示
2 b4 [5 U% G( K% N: i* j. y5 K* g/ i1 }+ h% b U K
class Solution {7 N3 ^5 M; Y2 b! }
public int maxProduct(String s) {
+ V) t; |* A. h4 G4 A+ N int len = s.length();
I/ g2 T7 J* {) m' ~3 y int res = 0;
1 D+ z( g L2 n. f5 A int[] mem = new int[1 << len];4 r2 l' f1 V8 K4 X3 t5 R# V6 E
Arrays.fill(mem, -1);% [( M( A- l" `5 f) s
for (int i = 0; i < (1 << len); i++) {3 Y( M: M! L# h
for (int j = 0; j < (1 << len); j++) {5 ]" T5 ]" ]0 P z8 x; |1 X
if ((i & j) > 0) {" b+ O8 ]' D8 A: a8 A v, x3 ^+ l
continue;
/ E* O# `; I; Q( ^1 h }
5 b% P, G3 p; w2 D( s7 r" [6 e! z res = Math.max(res, length(s, i, mem) * length(s, j, mem));
% }& n' c5 v# R+ z$ j5 O& O }! Y* S7 Z0 }( x3 y
}- w8 W- F0 e- S3 ]$ n$ A
return res;( p$ i- I4 b( G& A: w
}9 D- e2 y& d' @! V" `+ s+ B
7 \/ z5 W; Q8 t) M; b w7 B* f5 n* K private int length(String s, int bitset, int[] mem) {
- X7 I9 C+ H% [% |6 | f. [* z6 @3 ] if (mem[bitset] >= 0) {1 O- T% e$ P$ r0 ]: r7 y
return mem[bitset];
/ \0 U( E8 l& m" D% G }- l2 [3 ^, O+ h8 a' H0 T) I
mem[bitset] = 0;
8 U) t$ u/ P( \# {4 S for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {7 E7 g. I4 }8 Y8 R
while (i <= j && (bitset & (1 << i)) == 0) i++;9 V8 D" m& t) p. u1 {& |; t7 I7 Q
while (i <= j && (bitset & (1 << j)) == 0) j--;1 q$ I v I$ P( ~' o
if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
& t) ~2 F$ W- |3 X, U break;
& ~! V% s, z5 j- Z }6 ~/ F9 a+ x8 C$ A5 j+ R
if (s.charAt(i) == s.charAt(j)) {. p* d; P+ ?0 K3 A
mem[bitset] += i == j ? 1 : 2; B e' s$ F' C
} else {
' @! U9 w& G3 g c. C% d mem[bitset] = 0;
- o) \* }( V o2 s break;
2 C4 i$ b% |% ~+ j; R }! K7 T% D5 F7 }" p
}
7 N6 g' G1 F, ~5 `: K2 C return mem[bitset];
2 J0 y; m5 R5 h }
Z" }5 F& T4 O0 z. e, r}
! y, U6 m8 q5 S+ a p% `8 S
$ Q( K' [; @1 I0 h0 n i. F1 i S, D1 X5 c4 p) ^! V9 L& B# p& Q
【 NO.4 每棵子树内缺失的最小基因值】. @1 H* V/ B: ^
8 e9 `! _0 V: j5 N6 \) X' {解题思路: w9 h& }! s ~( y
DFS 合并 Set 即可。但是有两个优化很重要:
/ J$ q- o r# |4 z; v( M3 Y& Z8 J; X
2 [' U9 ?, V( g' A6 q1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
) @6 W0 _) o7 g! l. S
. o' j, v: ]2 e3 z2. 合并 Set 时由小 Set 合并到大 Set 中3 w v- M- Z+ i- a8 ~% c' e) S
$ P3 R7 \) W X% U+ G3 @2 J! R
( q: V: G5 t; _. ?. q; v1 m% f9 J代码展示, x! i4 ` d% d& Q
. s/ J1 u6 W! t9 V, U) Y
class Solution {* Q9 N, Q+ z. H- _2 ?# k# p
public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {
) v% d; J0 j+ k. _0 M/ l# c Map<Integer, List<Integer>> children = new HashMap<>();; {7 x& U3 x j8 z' l. Y
for (int i = 1; i < parents.length; i++) {
3 {( i: F! f% H; C if (!children.containsKey(parents[i])) {
. ~# @% `$ ~; a, g children.put(parents[i], new ArrayList<>());
; a8 f$ g& N% b4 E1 l9 Z2 | }: R2 H }' x" N2 N
children.get(parents[i]).add(i);% `/ A+ g6 o- [) M
}# t& P; X% ]' J1 e
int[] ans = new int[parents.length];
! t8 ]6 [1 ?- h0 q6 f" K+ } dfs(0, children, nums, ans);
2 H0 l% d' m2 L% d+ I" I return ans;0 f/ A6 D* B, W
}$ h: J' ?- s% S! \
- B8 q1 _; D$ n private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {
. Z) o7 I s% {2 v8 `2 X Set<Integer> set = new HashSet<>();9 {& {- S! Q: `* p2 H) A) R5 K) t
set.add(nums[cur]);
5 `1 _2 r3 r( B% A& I if (!children.containsKey(cur)) {8 u. ~5 u) H7 S; S4 F9 s3 k. x
ans[cur] = nums[cur] == 1 ? 2 : 1;
G7 x! }: X) A! A return set;( X$ h& h/ k+ L; P, V! w$ @
}
- N5 t: v- u/ a, H* m$ O- B: O8 ~" O6 v var child = children.get(cur);
/ b, Y m: D F/ g/ R- }$ g int start = 1;
1 }4 ^* f4 \2 Q for (var c : child) {* x, u2 Q9 J$ h
var r = dfs(c, children, nums, ans);
l3 ?( t" G' P1 E$ @ if (r.size() > set.size()) {
/ P }5 y( _# t Set<Integer> tmp = r;
5 i9 o; f4 }: y9 [6 j% @/ F r = set;
/ |1 r9 ?7 w+ s& M7 U4 } y set = tmp;4 c+ f6 y: E2 _
}
. K# z2 ?! R+ l" X8 P set.addAll(r);
" ?5 C( m6 o& w9 V' }, c start = Math.max(start, ans[c]);
) {, O. U$ e ] }' a8 x$ m+ Z5 H" [" ]
while (set.contains(start)) {( P3 E8 \7 v/ C) S, d
start++;
0 T' h9 } s* |4 { }
3 O) m9 R$ f' P: z/ j ans[cur] = start;0 N2 u7 X; A' f D V% D
return set;
5 w7 S' X6 ]$ s) L }
$ g7 u0 _0 ~" W$ X l* _, e3 M}6 B" n& z; ]: A
|