登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 反转单词前缀】& E% G& ?& |9 A$ p5 P) h- S
. o! J/ {4 g7 {5 v7 m
解题思路
- D7 ^2 l% h2 \, m0 Z* ^" d签到题。& C9 d6 ~7 S" h$ K' Q1 x( y9 t
& l- Z" W' r, a% M
代码展示
( G0 K: o" a& J( f, g3 ~' D. M3 N8 M* b& H+ Q! p0 c( ~
class Solution {
, R. o& Q8 t/ f2 Q6 X( {+ W; _ public String reversePrefix(String word, char ch) {
* ~& h$ C# X, N int index = word.indexOf(ch);
3 T( t2 D9 r8 ]$ E9 O' E! S+ r: F" ] return new StringBuffer(word.substring(0, index + 1)).reverse().toString() +
. c( r8 z; F, U. Y4 l7 m word.substring(index + 1);: y! H! {$ ?- y$ _4 ?6 p& j4 h- @
}
n$ J! }! S$ p}
8 t! k9 n+ v+ S" w5 B& q5 N) l2 F. P) x: C& z; ~6 o) \
: ?- G3 C8 o" ]* M3 X
1 c+ @. L8 Y4 K' J% @: w
+ ^$ j$ x) c% {【 NO.2 可互换矩形的组数】& n7 C. D6 o1 f1 o, O$ H0 l% h' @
+ z% n+ z. d: O$ c- | z8 O& U h
解题思路
2 F2 b7 g k0 ^% y: l将矩形按照长宽比分类,计数即可。% x, [* @, a; t, q7 z8 h
8 ^( H, l" \" t
代码展示
2 Y' u) X$ x: d
8 p8 `4 }! n& ~; d0 ~class Solution { |3 @ N2 ^$ h. h4 q% {$ @
static class Frac {
4 H+ q4 W% q. v. U( B int den;9 z" v8 N9 h6 z+ A; d- v# A
int num;9 j8 E. b3 v' e$ H( k. d% V6 J' ~, Q
' @% ?3 L9 |, a+ ?5 i: v4 L4 L public static int gcd(int a, int b) { g# t3 M. S# s
return b == 0 ? a : gcd(b, a % b);
% X5 I9 A- Q4 R$ Q% n3 `" U1 Y3 ` }
) i5 S7 \$ l. E) B: q$ b# {& J+ f4 |% E: j0 R ]) \ G
public Frac(int num, int den) {
6 z% P" W/ ?7 B: j I$ o K2 L! q int g = gcd(num, den);
$ l( Y4 n$ w% k1 L3 u this.num = num / g;( z/ l- n |+ }' ~) D/ j' u
this.den = den / g;' U. b# {+ j' d5 [. s! N
}
0 T1 s1 h3 w% r4 h0 Q% g$ W
) x# c' L+ q0 }7 R/ i @Override
( o9 H; L+ h6 L. J8 N" z public boolean equals(Object o) {- P# J$ U0 B' K& A1 n/ u$ W V+ \
if (this == o) return true;6 J8 Y+ u4 k8 t R0 v
if (o == null || getClass() != o.getClass()) return false;
# A+ a0 D# a& q; Y6 Q* E Frac frac = (Frac) o;2 _3 A7 x6 i- I+ d/ h! K
return den == frac.den && num == frac.num;
/ Z; m4 Q% ^9 a [0 ? }. O* J3 U# X, W8 |$ T8 ]0 H
- Y, |3 k, r4 c" {# z3 Z @Override
4 _6 B$ M/ s* n" u public int hashCode() {( n) g1 P8 P' A& C5 X: h: k8 K! O
return Objects.hash(num, den);+ u- ^7 [- J% P3 i+ X; k4 z
}8 v U5 H; I" W7 x, j" V& ]
}
3 h! K# s) Z# `+ K( Z; e/ }6 c8 T% b0 {# y, Y1 I9 @# c! O3 Q
public long interchangeableRectangles(int[][] rectangles) {6 b: Z6 L3 z6 \
Map<Frac, Integer> count = new HashMap<>();/ C/ W( n8 K* e. ]! o
for (var rec : rectangles) {8 q/ |( [0 G# H2 {) V" k. ]
Frac f = new Frac(rec[0], rec[1]);
8 K: Y+ D. v9 k' H9 a' Q E+ M count.put(f, count.getOrDefault(f, 0) + 1);
; S5 J0 R- @& X' b2 o, B }
2 r+ `! c: h( h0 I long res = 0;
, r4 o* { M/ V9 e/ D9 l. ^ for (var k : count.entrySet()) {
$ e& d& B5 q% d s7 z# Q int v = k.getValue();0 R3 x9 `2 R4 Y4 J, E
res += (long) v * (v - 1) / 2;. {, r$ I) i5 [8 d
}
6 ^/ u$ I; D$ S6 R return res;
% r+ C3 n; X. X# p4 n6 K! X }1 j5 S" ^; F! A. ]
}/ S5 \! k# ]. S- c. C/ I1 \: X
$ y0 M& ]$ r, Z ~6 I+ Y
Z4 k6 f) a9 R: G【 NO.3 两个回文子序列长度的最大乘积】( k$ K% _' d" l% O
% g5 p. `7 w3 L( L, D8 h' ?
解题思路3 v$ F1 M- j/ k+ H9 g R8 m( |
暴力枚举。使用二进制位表示一个子序列,枚举所有情况即可。: L) o S9 b" ]% K; c
& \* o7 r/ t7 u( t. T
代码展示, ^$ r( r& v2 n- u6 I0 a' h
6 m* U) W; H; q+ T+ `3 m! s& eclass Solution {
) g) g1 t5 T/ Q public int maxProduct(String s) {/ N& L5 |8 q, U2 ^* R* Z7 u; S1 U
int len = s.length();2 F- F6 w2 M! l/ _# j' G: n
int res = 0;- Y& n5 x0 M( j! P
int[] mem = new int[1 << len];
4 k7 j8 @! w ]) j Arrays.fill(mem, -1);/ Z# w0 q. M, d; \
for (int i = 0; i < (1 << len); i++) {" j) C% b# ^4 s
for (int j = 0; j < (1 << len); j++) {# T3 T, ~/ b3 a z4 h$ \- L) \
if ((i & j) > 0) {3 Q& W; {- ~5 V6 O
continue;
7 O9 W6 u* c7 n/ _8 c+ C# }) o }
/ E7 u" A: |3 k0 U& o2 g res = Math.max(res, length(s, i, mem) * length(s, j, mem));
) t* P& c2 U1 P1 f }
$ P/ h7 i' W B+ N0 p4 W0 I }
L8 r8 y: U" [) j" |2 P( D return res;: `" D4 u# f; X5 c/ E0 |
}
" C4 B; Z4 K' `8 c5 t- r
* [ g: r# C: J8 B private int length(String s, int bitset, int[] mem) {
3 y! p7 O/ Z* b, W3 _! s if (mem[bitset] >= 0) {
* k: ]+ ~. P1 j0 M4 k0 E( r return mem[bitset]; y+ O" a# N& T. _
}& X9 p% N J; I, K J& W" D$ B- j
mem[bitset] = 0;2 b' M* a0 E$ ?" @ n1 f9 d9 ~
for (int i = 0, j = s.length() - 1; i <= j; i++, j--) {
# b1 S ~; D4 V3 }! D while (i <= j && (bitset & (1 << i)) == 0) i++;
) ~; T' g+ U" Z( A/ ~ while (i <= j && (bitset & (1 << j)) == 0) j--;+ q: u. m5 c. I, W/ C
if (!(i <= j && (bitset & (1 << i)) != 0 && (bitset & (1 << j)) != 0)) {
! ~, s) Y2 [9 ]: m break;
" s& b9 e. `! o l* `7 a }/ K& ]! A3 c4 O" f& V# M
if (s.charAt(i) == s.charAt(j)) {- s/ N, C& ?8 E: x: k
mem[bitset] += i == j ? 1 : 2;. _" C: |* h$ P. L" ]
} else {
+ g4 ^: ~+ V5 N5 h/ \' F8 R' X mem[bitset] = 0; N: ^3 `' @) l$ c
break;
" J8 ]3 D3 L# G' {8 J5 F }
$ K7 a& x" b: }/ p2 T) n }! z( y1 t% E, W9 [! o' a, \" B4 w
return mem[bitset];
8 d6 j' f5 }5 F0 b8 N, O }! A' r# t i, y3 c
}( F! t2 S, |3 X4 j' \& ~/ W
! H* p8 X3 ]2 H5 c; H
, T% U9 s6 i( i6 y
【 NO.4 每棵子树内缺失的最小基因值】
8 R7 x& Z- j3 W: {7 K$ T
. @" E$ Y0 a+ x0 p" B( a, p, S解题思路
: E0 q+ e2 v4 i/ Q# s) y* n1 nDFS 合并 Set 即可。但是有两个优化很重要:5 c6 ?+ s# D" W$ P V% P1 ~
' ]5 _7 e3 I" C* ~( e! B0 r" b1 Z9 r1. 假如子树中缺失的最大的是 x, 那么枚举查找当前树缺失的只需要从 x 开始即可,而不是 1
5 d8 E. D/ z7 d/ M# l9 l U! {/ n' }% l U: ?
2. 合并 Set 时由小 Set 合并到大 Set 中% Z5 \3 R; [9 H! |0 W" r- W# d+ B
. ]6 j/ x8 A3 W8 k, ?* l L# F
g. q5 ?1 E0 M S8 i4 O. y3 c% Z/ ?代码展示/ Q' a% o; d3 T/ r5 I- Z
/ B4 u( V/ }: ~1 U- z' G5 i% `6 Vclass Solution {2 _# B( H) q; b. e W) Q1 e
public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {7 J. s7 M. v$ l2 a3 }5 O1 A
Map<Integer, List<Integer>> children = new HashMap<>();
- u& j7 t% ^/ U D+ W9 t9 s for (int i = 1; i < parents.length; i++) {* g |* V9 ]0 c T. L/ _7 _: b+ ~2 T
if (!children.containsKey(parents[i])) {
5 j9 f3 H. k" I0 k" n children.put(parents[i], new ArrayList<>());, d+ ~* I3 B" s" \& Y9 p5 j' \
}
7 }( }4 r! U% [& ~ children.get(parents[i]).add(i);
* R1 g6 w2 `% ~3 E2 } }; B9 t; d/ v8 P: a9 m+ q7 P
int[] ans = new int[parents.length];, u5 o6 o6 M& |; [* e( w0 l1 |
dfs(0, children, nums, ans);' X; G5 c- q! l5 `, O( v3 o+ h( f
return ans;$ ]. Z, c) W- G6 C
}' b* O# T# q9 \' n9 e
' M- a5 K2 t5 S$ ]+ t private Set<Integer> dfs(int cur, Map<Integer, List<Integer>> children, int[] nums, int[] ans) {
^. H3 @" S8 F Z5 N# x9 A Set<Integer> set = new HashSet<>();
; F1 B/ C4 B. Z, P& i, W set.add(nums[cur]);
3 O9 v( r% T5 ~1 H3 W8 p if (!children.containsKey(cur)) {
! T3 m& A4 |1 ?4 e ans[cur] = nums[cur] == 1 ? 2 : 1;
# F0 c" Y0 z. k return set;: {+ I) w+ v# Y/ ]9 J
}
: `" W( [( H9 B% k% S$ s var child = children.get(cur);
( a9 k! Q( ?) g int start = 1;& R* U2 u8 n. T1 Y( J0 V4 o
for (var c : child) {- H, y c6 f \, z4 \
var r = dfs(c, children, nums, ans);4 L$ s7 G& O; h4 U
if (r.size() > set.size()) {
! G0 |# v: c. ~ Set<Integer> tmp = r;4 q4 Q2 k$ g/ A v% g; Q5 v( w
r = set;
, j6 L9 j4 _ w6 w! N8 h) j set = tmp;
8 s" n% E0 J: P/ i- u$ z( A$ v$ V8 b }
+ ]) A$ m) p# F4 c' h# _ set.addAll(r);
/ R" o; k! q7 N( N. V$ p start = Math.max(start, ans[c]);
$ s; F ^7 E; |- c" k }
: ] r7 a$ q6 p& i3 c5 }$ H( Y while (set.contains(start)) {
, ?/ O8 `/ A. m" a7 Q start++;
/ H# d" W: M) r7 t& u( H' F4 x }
& T+ O2 G" C/ i! G$ c3 X& I ans[cur] = start;
' f& W! `5 x9 z9 i1 h! ^1 c G; } return set;" e! ?0 Z5 ?& M/ @) X a; |- r
}
- t9 e! _) A) y3 |}2 s. T8 |) m" k& B1 \
|