登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转单词前缀】9 ~3 Z$ B5 M5 Z( ?" e8 s) Y
- a: s+ K7 k2 y: ^" h( O6 d解题思路/ }1 R8 V+ A/ n8 |5 _3 n2 K9 W
签到题。
; F$ Q; k& `2 K {" E3 q1 m
+ ~3 m# {. P$ Y/ j) A+ @, ]' S代码展示
5 O. H8 @5 S0 ]4 T' b- T
/ [' A1 N! W, A1 y; l" s9 Q6 y) E( `class Solution {! H$ ^$ V# }' i4 `, P( X# q" A
public String reversePrefix(String word, char ch) {
; v# {" g8 g% o) G int index = word.indexOf(ch);
* T }" k2 i$ m% \" Y4 M return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +: e# b4 z. Q0 R; m# B
word.substring(index + 1);8 D1 X8 d5 [% f% N) D$ g3 g
}
( U& _" M/ l' D+ p0 ]}- z. t/ k( h/ Z D
* b3 \3 D9 \% q3 R* Z/ d
: x+ F' V2 r( u/ Z
3 k2 A4 k2 q0 q" b& M2 W2 w
0 p+ I- ?* J; q; |8 {5 }【 NO.2 可互换矩形的组数】
& Y+ G' P4 z4 O! ~
) q; M# D b0 |/ f6 f# K4 R1 X+ S解题思路
6 `3 U `$ }* w$ p6 o, S0 D将矩形按照长宽比分类,计数即可。
& X8 @! L$ H" Y9 [
. y# D' N* c1 q* `3 N, |代码展示* k$ {) b, a$ L$ @0 N [. D3 K
/ C7 m% b! F5 f8 `4 _
class Solution {
/ p+ V6 t! {5 O$ f Z2 T* M7 p! u W static class Frac {
) ?) N( V2 m" S7 S4 Z4 f int den;( }' S, b4 W7 {9 }" p; p
int num;# g' A1 ~' y4 O; N
" r0 l4 Z) r2 _) l- n/ Y; B public static int gcd(int a, int b) {
! M8 p# k7 r4 B- s$ Z return b == 0 ? a : gcd(b, a % b);# J; ^' G% e( B2 U
}- ^6 x6 ~6 I5 l8 Z
4 n* m m! P7 P: q) K3 M public Frac(int num, int den) {2 O6 v; v: y/ i' k5 V x2 l) ^6 i
int g = gcd(num, den);
+ I. L& D' J) T- G8 P this.num = num / g;
O; W. t3 ], E8 G this.den = den / g;" o% o6 a5 ?& b4 s3 b8 u! j" T ^
}
4 k5 Z* t: i1 }9 l4 `# z; H: d! z$ o: Q+ ?3 q
@Override: t+ X0 o7 J& t) o
public boolean equals(Object o) {6 H* a9 |& ?( O. v& ?! Y; J( g
if (this == o) return true;
/ h+ t, X8 E! q if (o == null || getClass() != o.getClass()) return false;
C D8 ?1 Q* F2 e; s4 U/ M Frac frac = (Frac) o;
2 s1 |* N+ y- O& ]6 W* {0 W return den == frac.den && num == frac.num;5 n k" l% R# |5 e; A: I
}
9 M& B, [/ L8 B h
% P1 A: ?; \# M; o# L3 q/ Y+ n/ w @Override" n/ y/ W6 u/ ?' p
public int hashCode() {# E5 V3 r1 k$ l; q' s: Q$ U" C0 m
return Objects.hash(num, den);
+ c9 _3 @" e) X4 C" I }. v( E4 t! {/ P: |9 E( P
}! `0 a+ O; D" K4 ^' Y. X
* m8 P# _5 P: i1 y
public long interchangeableRectangles(int[][] rectangles) {
5 P$ @/ I3 f# J5 k Map<Frac, Integer> count = new HashMap<>();
2 ?* e4 I" i9 Z3 S$ p for (var rec : rectangles) {+ [4 F* Z& X& A2 D( T) @$ t
Frac f = new Frac(rec[0], rec[1]);4 Z* b( X( T, ~, l
count.put(f, count.getOrDefault(f, 0) + 1);
+ c- f$ G) t; C' I1 W }
3 \# `( [" Q. r9 `0 H5 z long res = 0;9 k5 \9 o$ [6 s. C
for (var k : count.entrySet()) {+ F( P6 ^! ?/ n) U. L4 _& h( s
int v = k.getValue();
. Y$ M' i; B4 h* t! t/ K1 M res += (long) v * (v - 1) / 2;
# m* Q& p' {2 P8 k- c4 R3 ~+ C }
0 Z, `- x/ z! s" E6 N$ r return res;9 n, I0 r- R! V$ y# T9 w
}( K8 o; P, @" S; [% i1 U8 ~4 X
}) W4 r8 D0 f; p
! N; E- B" y5 Z* a, g9 R+ Y" v& C
* B! G4 B7 s7 E! g' ~( v【 NO.3 两个回文子序列长度的最大乘积】3 @" d+ M/ i( i
( B0 _; m* L0 C. H- @* ~2 [- p解题思路
1 V9 H" a6 ~1 _7 x( G) Y暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。, f% T Y ~" v, \' _% S
. N% G. X3 J1 G$ `. x$ l" y
代码展示
! A. D j+ \" Q8 M
5 Y* V+ o, @3 _, j" d, |6 oclass Solution {* k1 u) y5 `7 K0 T2 W# T0 ~
public int maxProduct(String s) {, {' T9 v0 R a7 b
int len = s.length();: G+ {4 t0 e7 j/ c5 [
int res = 0;# k! g% K8 s( `6 I8 \1 ^
int[] mem = new int[1 << len];5 c3 n' a/ ^6 M( |
Arrays.fill(mem, -1);/ f* V- u2 B+ g$ q
for (int i = 0; i < (1 << len); i++) {
- a) Q2 y& R- y for (int j = 0; j < (1 << len); j++) {8 g7 \ w s- H! p
if ((i & j) > 0) { Q: [/ j8 t/ }
continue;
. _9 z7 g5 M4 `) t! Z1 M }& ]: V+ G+ y( W0 h
res = Math.max(res, length(s, i, mem) * length(s, j, mem));
- w# _, V) i; Q% M }
3 p, d) c' r/ K, a3 X7 D }
# x, y4 z3 ^- |+ `3 P* [ return res;
" B& X. Z4 o- I1 w/ a, x }$ u0 O* @9 _ |4 h
1 a' e( ?6 c2 p0 R0 R) S private int length(String s, int bitset, int[] mem) {7 c+ L( E1 E: W9 } M4 K
if (mem[bitset] >= 0) {( A$ G6 M# d7 A) h( f' F s
return mem[bitset];5 n, i6 P7 a0 F! O2 P2 n+ a& R
}
d% t& j# {9 y% ~ mem[bitset] = 0;
! M4 N7 j$ g, n( L4 }8 p: m9 l for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
% ]* J8 u, l2 F0 x9 V' P7 [( Y' U while (i <= j && (bitset & (1 << i)) == 0) i++;
7 o$ g# ~4 Q* T7 a8 t3 _6 c while (i <= j && (bitset & (1 << j)) == 0) j--;- f/ l9 ^; z$ j9 u) N' N3 @0 C$ j
if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
0 N0 `% E8 o( Z4 J0 r break;
) A" p: }9 n$ d3 r; c } @2 o5 } G: y: K
if (s.charAt(i) == s.charAt(j)) {' @& y* G# m7 h% v" C
mem[bitset] += i == j ? 1 : 2;
) f* Z- u+ {1 |5 r5 X } else {3 a6 o) n8 Z9 V2 b a
mem[bitset] = 0;
/ N: w, ^, o: Z break;
: y- {, p+ D z" [# N: g }
; b4 v7 X/ k3 c; Z$ G! w }
. W0 F$ C! P3 J4 ?) ~ return mem[bitset];
8 p8 O* i1 _$ X; V6 g }
/ ]7 S1 A; T! C( d6 H}
2 _" B; i% b. q1 M& v8 Q
1 u$ R7 S1 S6 p! W( [% p( Q) d
" Y+ K9 ]2 v- G【 NO.4 每棵子树内缺失的最小基因值】; g" |) o1 }3 ]1 `
) i1 p6 ]+ c: R, t% j$ f. \) m6 ?
解题思路
8 C7 q4 P- M/ a$ SDFS 合并 Set 即可。但是有两个优化很重要:
2 P! ~, d; _8 R
* \4 V; |; x e+ e, _, M1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 16 G7 o) h4 ?7 [+ d9 o
4 `) ~1 s1 h- V- t2. 合并 Set 时由小 Set 合并到大 Set 中
" y m9 Q2 {2 g! {& d! b1 Z" r N k' ?3 Q
! F5 X% c2 R! z) x9 x! S代码展示" r5 u" ^; s( @; W" f/ `( s
8 c6 b1 H/ B* A' ~8 S6 rclass Solution {7 f% {2 i( `& Y$ B
public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {# A) k W4 s! O1 ]: ]& F
Map<Integer, List<Integer>> children = new HashMap<>();
9 m3 @4 i o& Z8 b* n for (int i = 1; i < parents.length; i++) {
+ t* I1 H$ p4 s if (!children.containsKey(parents[i])) {/ F E. ?5 f1 U4 R) ?% x5 e" T# L
children.put(parents[i], new ArrayList<>());% }( ^% k' ]& k; K! C
}
) k2 h+ m: m1 e3 o/ k, H children.get(parents[i]).add(i);5 Q1 r, b6 Y- n: b
}
7 \- w; Z. K- P1 x) w int[] ans = new int[parents.length]; g! J1 N# \$ }# W
dfs(0, children, nums, ans);
' O7 ~( C" o4 y& O1 F7 I2 K return ans;: @1 p' h* E" p+ `) n; K0 k8 X
}3 y, e/ L) o5 p: _) X) d* x0 o
# J5 i, t' h/ M; E# I1 G* V% |" H private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {, r2 J7 e3 _# d3 F. c7 W4 B8 j. u* t
Set<Integer> set = new HashSet<>();
$ p, u x- [% v set.add(nums[cur]);
0 U# ?, }% E9 K6 h$ z+ v$ o if (!children.containsKey(cur)) {
6 h& q% |; Z# A ans[cur] = nums[cur] == 1 ? 2 : 1;, k" ?8 I( q ?" M0 a
return set;
. z8 W" e- n1 a2 I- w6 k, | }
' k) n9 Q4 h W4 { var child = children.get(cur); a l" v; k9 B5 N& I3 O6 q S
int start = 1;
4 u4 r# t+ Q# A& G/ Z, ~4 l for (var c : child) {. s+ o% K3 U8 w3 `
var r = dfs(c, children, nums, ans);5 Y4 I2 D+ N' g% e- R, t: v
if (r.size() > set.size()) {3 x2 u5 X8 k# f2 O! Y
Set<Integer> tmp = r;. H- C4 f7 \0 @7 w7 x
r = set;6 U+ l, y, V+ o0 |* d2 B! L
set = tmp;* g& m5 [* ?2 N9 O# y3 d
}
/ q; Q$ W7 s, Y, V/ ]+ |9 b7 k, w set.addAll(r);2 D# u' ?! G3 Q
start = Math.max(start, ans[c]);
8 Z* D) h3 F0 z& C, H }+ y2 {. j; f, U; M2 R
while (set.contains(start)) {
" ~4 o8 c; P9 C4 p! M- Q7 o; ]4 J start++;$ U2 ?. w6 `0 v, G5 _
}) j9 V6 f. U. a
ans[cur] = start;
2 R8 D8 G$ n. Y0 R0 q0 y# ~+ d return set;# e1 d$ K' u7 U1 p8 n5 C& D* V
}3 h! ?2 i3 [) w3 a
}' e1 v R0 p7 E1 K y3 z: x
|