登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计特殊四元组】
6 }3 p# m/ _# y解题思路6 L9 `+ @, \7 ?0 e# R
签到题,枚举即可。
3 {6 @1 J, G7 h3 W0 H
6 V, E/ E$ v) m0 ]) r1 J4 m代码展示( S: ^% A& v8 U# A% b& w
$ ^2 _# ]& v8 ^% t& |) N
class Solution {
* r, D! O" t0 g public int countQuadruplets(int[] nums) {3 K+ Y, G0 U. E: X8 Y) |4 m7 c
int n = nums.length;" g* c, d* y8 i h
int res = 0;) j* Y& U* Y$ T7 m/ S
for (int a = 0; a < n; a++) {' s/ G- N$ R/ L3 U) g
for (int b = a + 1; b < n; b++) {4 I7 Y0 j" h1 u$ T
for (int c = b + 1; c < n; c++) {
, Q: q+ k8 T$ x3 F* K for (int d = c + 1; d < n; d++) {
6 L* p) p: r3 Q0 H G if (nums[a] + nums[b] + nums[c] == nums[d]) {
4 k" @# J: C9 M res++;0 T: h+ F4 e: m& K) ~3 `
}% `/ V& ~" A( l& D
}, e* Y/ ~+ W: r, _, D
}
% P# n- U7 h) | }
j6 G1 w7 k, P p }; Y0 C* O9 H r- z0 f
return res;
: s+ L6 _& e8 L5 V e! L }$ b* v5 B, j/ d6 r2 ]$ c1 V v
}/ {/ x7 |7 K1 V8 R- f. Y p) Y4 _
7 M, S7 ~! O- l% N) L
$ C& n* I( H, Z/ K6 L
7 r" f8 U3 v0 f( B: [- }! c8 R- V6 D% k: A4 q7 f4 \
【 NO.2 游戏中弱角色的数量】/ A3 n2 q9 Q t. k
解题思路
! t, K2 ^& B! u8 o, s: l按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
- D* ~6 \: P3 R3 `/ U3 d
4 |' z8 U, P: q, W) i代码展示
8 F. G0 ^" J% A& V- ~/ S- }+ a! E! \% X! Q2 I5 s. u1 x- P
class Solution {# W2 p7 h4 L0 k `; L/ e2 c9 `& k
public int numberOfWeakCharacters(int[][] properties) {! h4 ?1 @! `' r5 |6 C2 d7 K) g9 ?; B" q
Arrays.sort(properties, (a, b) -> {" K8 S8 M' ]3 s }' s
if (a[0] == b[0]) {
0 H& X' I5 d$ O return a[1] - b[1];
% i3 W2 s: N; O5 f( r' A }/ f! b5 k" x4 Q9 a) I/ G& T
return a[0] - b[0];
1 q( _: z9 Y# U& X });
, ^6 Q6 q/ G7 z$ q int res = 0;
9 q4 J9 F2 U2 A3 M, T int lastAttack = properties[properties.length - 1][0];% Q, {7 ^, y! F5 ~7 ]% V
int lastDefense = properties[properties.length - 1][1];7 P* a0 d( |* g" w2 I: y
int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力
q- h# m t' K: M, S for (int i = properties.length - 2; i >= 0; i--) {
) ^; D; [# H5 j3 U, _ if (properties[i][0] < lastAttack) {) A! n$ p* O+ q, W4 a" K
maxDefense = Math.max(maxDefense, lastDefense);
! \: n% ?% X$ \' i2 b; h lastAttack = properties[i][0];; ^; |+ d O6 R* x0 a
lastDefense = properties[i][1];. w* F( O* I" }8 F# c) d% |
}
6 G, `5 e3 w. F8 O% Q, i+ L if (properties[i][1] < maxDefense) {
2 E; o* b3 G$ n* y res++;
/ ]* E; U! [3 e9 w8 @" N0 s& s) a }
2 O* c U: {9 d* j }% P# V& o) y% S- C4 y3 s. i
return res;7 F7 } ^) a; I6 q. m+ Y/ N
}) H% M& d, f7 ~& B6 J
}# w* z {1 ^6 L# r }+ b
0 U% F( `0 i: E. `6 [7 G& T' A& a
" l3 @/ Z0 J" y4 Y5 X
【 NO.3 访问完所有房间的第一天】5 d8 t v7 |% ?4 b
; T- t7 @) K: w$ K' y) G
解题思路% L' D9 g. Z) [# e, ^
动态规划,dp[i] 表示访问完第 i 个房间的最小天数。
. U1 T" j( _5 ^: R4 T5 o0 j, J& ?9 Z4 _. I& W
代码展示8 ?* v& h# F k+ x( f
. Y. g3 Q+ Q8 a5 c' {
class Solution {& d7 \, a$ Z% P% {
public int firstDayBeenInAllRooms(int[] nextVisit) {% R' V0 }) H; Q# p
int n = nextVisit.length;
, \+ A5 ^4 m) j7 _ {: X long[] dp = new long[n];/ \2 F: b8 |, l6 u( B' m J
long P = (long) (1e9 + 7);
8 Y9 S1 d0 W7 ~* I for (int i = 1; i < n; ++i) {
* P& e: I, h$ k5 U dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;2 k4 g5 L/ G4 b* x' E3 b' _1 G
}
/ t4 T$ m! {" ]. M9 | return (int) dp[n - 1];
; B5 h. F4 e8 h" q/ p, T }
2 ]: ~- P7 i Z' _3 ~2 [4 t4 x}
2 P0 G9 k- o$ i( u. Z. Z8 ~
- R5 `7 m- G4 q b" T4 m/ I【 NO.4 数组的最大公因数排序】" [5 ?4 o$ \! z" S7 C
* R! E: w0 h$ ^5 A解题思路
5 z0 @5 s( d1 V7 ~2 s: L/ |只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。9 G+ o# j. p7 W w R$ x
4 u* q3 } E( o. Q; n% w5 e
" c, {/ ], _' J+ S( I代码展示9 Q/ L; S# b- p$ Z
8 d* m/ ]- y i3 }
class UnionFind {5 w3 _% d8 ]& p0 A+ k3 U% L
public UnionFind(int size) {
1 b& c# y. {9 n3 b4 a- e f = new int[size];( i6 ]5 e/ a+ }* l- u
Arrays.fill(f, -1);
( L( V+ J3 M* E; l }: p6 ` p% t$ r, @( K6 R
0 T F: d4 c/ U. j6 n
public int find(int x) {
9 K( P( c8 }, G, d, F if (f[x] < 0)' `4 M6 l0 U! I# p' B( y H
return x;
7 _3 C4 {) e) P$ Y) J9 b return f[x] = find(f[x]);
B U$ b' L$ o( N$ N/ c5 ] }
; X9 x/ Z3 U. w" b: b, y" K: `$ j. ~) @3 ]) P* j8 C; A
public boolean merge(int a, int b) {
) I+ u! p7 c# |7 ?0 i/ n- A int fa = find(a);
* S l# m& @ P/ G! a% X. a int fb = find(b);
# c& R. a) V& P0 b) R/ U if (fa == fb)" R0 V- h2 @* K, }) l) K: F
return false;' h. M$ R) H* N) }& Y& U, m
f[fa] = fb;
+ x8 j/ B1 I- s3 W5 v return true; t& ?* ]1 z0 @. x$ {6 W$ N4 T J
}
" j+ U( B& w; ]2 I% d+ u# p2 u% |9 k3 d) ^! l2 M
public Map<Integer, List<Integer>> sets() {
! G4 Z0 K" o4 ] Map<Integer, List<Integer>> res = new HashMap<>();4 ]9 k m' h% w: G& [
for (int i = 0; i < f.length; i++) {9 ]& y; `2 K3 G6 ~; q+ a; Q
int fi = find(i);
; F. }) Q. M | {5 n g if (!res.containsKey(fi)) {
' s% M2 K% |4 r R+ r Q res.put(fi, new ArrayList<>());
0 ^2 a, t, v( m; G0 a }
+ _0 X, p. }/ K2 [9 _ res.get(fi).add(i);
: ]# A/ j( W; [2 M% @ s# w' G }
3 G: l5 c" ~6 j return res;
( S+ V1 I7 ^# v; U) A }
, p3 @: Q& W1 X" G
/ {2 f8 {; W, ]2 k1 e( { }5 t7 q private int[] f;+ B# q* x4 ^/ I9 V
}1 I" C7 x I2 j, L5 k; ~
; W; \$ T0 m9 C( ^% \, l+ [2 |' s7 s! T# C% [, L2 M3 q
class Solution {" X) U, X+ o" u" V4 e8 D' E# i, S
public boolean gcdSort(int[] nums) {
~% b4 V- E. m Map<Integer, List<Integer>> set = new HashMap<>();
- v s1 p$ C; A: s for (int i = 0; i < nums.length; i++) {
, O* `% _0 P9 z5 ~ for (int j = 1; j * j <= nums[i]; j++) {
, B; i! k5 p9 J1 E0 r3 J if (nums[i] % j == 0) {' q2 j4 d9 P4 t* k" b
if (!set.containsKey(j)) {/ e, R! a! e! e) c* n' |
set.put(j, new ArrayList<>());, d9 c n; u& }0 [
}$ f2 a( @( T: r# T- r6 G2 e w
set.get(j).add(i);
- Q7 u; z8 E: }. n if (j * j < nums[i]) {
, ]9 t; `! Z ? int k = nums[i] / j;* v7 i2 i7 I/ w7 K
if (!set.containsKey(k)) {, h' P: c) V$ _: D
set.put(k, new ArrayList<>());( b. [6 i* v' Y7 a; {
}8 O! \1 |. B& G# X
set.get(k).add(i);
' A* H+ [5 j# h1 S# D/ k4 `' ] }
9 @/ Q/ n3 F+ M! [+ ~ }% X" c6 T( q- p3 v* j
}
L/ [& c" @ e; r7 _8 N9 m% x }# }1 t" n4 t# e3 e) R
5 H q5 T& p& V
UnionFind uf = new UnionFind(nums.length);$ h7 x$ R& r( p* V- z
for (var e : set.entrySet()) {
1 t' ?4 m0 B( F: K( J/ E if (e.getKey() < 2) {
: H4 s( _8 W0 } Z continue;
7 W+ ]3 J7 Y. J6 g }
9 N8 W4 D" v2 D6 F B/ h+ [ var list = e.getValue();" K; I5 _) x, d# t3 [/ k" K
for (int i = 1; i < list.size(); i++) {
& M% W" v+ J, g6 ]- l uf.merge(list.get(i - 1), list.get(i));
* O2 R2 K* i2 i. M# L& p% K }
7 e# I% b/ g. h5 E8 V3 e# z6 K }; r ^+ M. \0 G- G
var sets = uf.sets();
" ]3 P7 ^5 h+ `( @" P, f+ M int[] res = new int[nums.length];6 n5 h' m+ G$ Q! y2 w2 x- C
for (var e : sets.entrySet()) {
- B0 J2 P+ R& s$ a$ b. E- u# ] var list = e.getValue();
7 l! k* c/ R1 Y. c& ]( L# U' g7 X var sortedList = new ArrayList<>(list);
# K' ^7 I, [/ F' X2 O2 g sortedList.sort(Comparator.comparingInt(a -> nums[a]));, i8 G3 f% p3 P5 a B
for (int i = 0; i < list.size(); i++) {
3 T, T3 x0 r& L" `; L" v2 L res[list.get(i)] = nums[sortedList.get(i)];
: U+ p3 L+ {" O1 R& u }: B. G- t7 J' Q. t
}
7 i% c- s9 d# Y- s. ^/ { for (int i = 1; i < res.length; i++) {' b2 c6 F' Y" C; A/ P p/ J! l
if (res[i] < res[i - 1]) {) B. W* T8 b9 |
return false;- a5 r# j( n% Z/ L) v
}; R" \; I6 i, H7 H2 ~/ {& H
}
0 E5 G/ ?6 O3 P return true;
6 ^; Y- m4 M2 @ }5 |" N/ K8 G! a J+ K* |; u
} |