登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计特殊四元组】
3 E! A! I' }4 E/ p' W0 p解题思路
. h: l, H0 q; |" ]0 l7 y签到题,枚举即可。
) l4 p! a U$ t; {- [) ~4 ~
3 {5 U6 ^ i! Q: U( C4 s, d+ @代码展示
* V. A1 u3 |8 O
4 {) @" j1 v& D. _class Solution {
4 a' I! o6 h3 F, j public int countQuadruplets(int[] nums) {
: V; I& s3 R! x" H" c2 f int n = nums.length;
' l% M1 x* t8 k1 p+ O+ v" s int res = 0;
: z9 M! k }* }5 B+ l9 W for (int a = 0; a < n; a++) {3 f: l$ t# o/ @6 L* n: ?
for (int b = a + 1; b < n; b++) {
" x& [ G# }$ d, a' v for (int c = b + 1; c < n; c++) {
1 u( C4 O; B$ l" s1 x4 b! S* L for (int d = c + 1; d < n; d++) {. T) X& g" f" C3 `$ H6 A n
if (nums[a] + nums[b] + nums[c] == nums[d]) { B' q9 `2 z& Z; `; l: I
res++;7 c9 M- g; B: v( {8 D8 p7 T- l" J& |
}1 r" _ f* Y& X6 w+ g+ W
}- Q$ v, |% p% r3 }
}
' j4 Y5 m* q5 f8 O }3 X& a) B$ T+ w7 G! W
}, D W! c# T; D' s9 t
return res;
- Z0 ?" s+ c' N+ x7 @: k }
) P8 V% S# v7 Q. g}
! z/ C6 q' l5 ~4 s( m0 u
/ F$ k6 N3 A7 v6 g0 W+ z
+ }, o3 [- I# E0 A; X& L, z# ?% ^
! |2 f" p; f- J) w【 NO.2 游戏中弱角色的数量】7 s& ~- x" s Y9 |' P! S
解题思路! r1 Q# Y# X% }- s6 @$ w0 @
按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
/ ]1 Q+ L/ z$ h) v9 ]0 o" P- u! @7 _4 v* p
代码展示
4 @* S) ?" J8 \( h& W, U w9 \" r/ D, W, Q; n) }6 G3 S$ W
class Solution {/ `# B; T$ k8 `% F
public int numberOfWeakCharacters(int[][] properties) {7 C& @4 J" Q0 x4 q. }: r9 F
Arrays.sort(properties, (a, b) -> {
8 a' z( e0 v) w1 I if (a[0] == b[0]) {& R$ n( e; R* W+ O
return a[1] - b[1];2 d! G5 c& w& t
}
- [$ s9 C8 b ]& r4 \1 H+ Z7 \0 i2 n return a[0] - b[0];
% n. q" Z4 F8 [- D* ~% v });
# m9 i$ K8 c8 K! m) X; C int res = 0;
1 |' Q) g" d& S9 h7 e9 z int lastAttack = properties[properties.length - 1][0];
- |; ^' o8 {% q3 I' h1 j1 } int lastDefense = properties[properties.length - 1][1];+ ]- X! H' V! a9 c7 W+ e6 D+ P! e
int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力0 D6 I+ f4 N O( ?# F0 g
for (int i = properties.length - 2; i >= 0; i--) {
: _! p+ \) e8 g8 @' C4 e- w if (properties[i][0] < lastAttack) {5 p# |) D& d+ A! b9 h' K) T; `
maxDefense = Math.max(maxDefense, lastDefense);% i# Q4 V; S e- Z: P! }+ J5 V
lastAttack = properties[i][0];3 K3 @1 s: X/ K
lastDefense = properties[i][1];7 D5 d# f6 T; Y5 L4 p2 e# g
} j) O* O9 y+ r; v8 ~! I
if (properties[i][1] < maxDefense) {
' K" z7 t3 G0 h res++;
7 z. F+ K7 f, m2 x }9 K: T' P/ ^5 u/ H E2 [! _
}
( a: `. _# w+ n$ I, w- {, K return res;
% }" X; P$ t' J2 M7 ?3 h }* Q( X9 N& p* b/ b/ `
}3 e* h, r6 }; S2 d0 @
9 L% i8 b: p) ]9 i g! ?
# }$ {* f- j+ s: k【 NO.3 访问完所有房间的第一天】3 Q, {( g ~( R+ d
, `) [8 S! u* \. R+ o解题思路0 t: `: J! l( m& L! f* }8 u2 N9 Z
动态规划,dp[i] 表示访问完第 i 个房间的最小天数。# t( _! } F" ~4 Z- {6 X: W
. C: Q+ l* ? Z5 A, X7 Y
代码展示
4 N- L: e% ]$ l/ C% r {2 y1 ]% N7 I. B) x( E
class Solution {
1 q* ^% \$ G6 I$ r public int firstDayBeenInAllRooms(int[] nextVisit) {( `5 `( m$ z1 W# ?4 |7 H0 d
int n = nextVisit.length;
; U# P" z6 \. B7 q long[] dp = new long[n];9 v2 @& |, z' m/ |# M
long P = (long) (1e9 + 7);
$ ?1 f$ s+ [4 d/ k/ P for (int i = 1; i < n; ++i) {
5 g) c' u) Y( t1 [3 @* f* b; d dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P; C. i, b: K6 D7 a+ Y1 W
}
1 J v/ h V1 F# ~! P1 X return (int) dp[n - 1];
! Y$ W5 l4 s! b. p. m }
9 t. z' i- l X* u1 q/ u% G: u9 Y2 K7 ]}4 k- I5 |( m' @* Y0 E( }: `3 s3 q8 Z
V6 \3 E0 E6 Q- k6 P【 NO.4 数组的最大公因数排序】9 z$ t; i' J; b
1 z; }1 I. d5 G2 d" T1 q& ~1 v
解题思路2 z& @# F: A+ M3 A
只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
' _7 u1 C2 z9 D) o5 J* G$ v
% \2 }, A( F4 H
7 {; a- T" D4 a8 W' q4 r代码展示
6 L' Y! E1 N! ?5 T1 [
0 |8 l6 t" F# I" C1 i' u! n, iclass UnionFind {
' y/ T* } d7 T ]5 z s- F public UnionFind(int size) { f# r% [: _& @5 S8 [) y5 q# {1 C
f = new int[size];
% ~, E/ h" y+ I$ P1 j! J: D Arrays.fill(f, -1);" Z" E, f w8 _* D' h
}5 j/ G" q* ~7 p. V. q
' K! G0 W( R: N, y. i M public int find(int x) {; ^0 p% k1 S$ |: n# w* X
if (f[x] < 0)
5 l2 V) L0 X0 [: Q+ H: q. u return x;
! v' D0 w- T' Q9 m3 x return f[x] = find(f[x]);- R+ U7 s# R1 A5 }- [/ H! a/ _+ R. }$ b
}. J9 S1 Z2 S# q7 m K
2 X, M; b" R# L2 j [ public boolean merge(int a, int b) {
( x# P, R2 w- V- T% @7 v int fa = find(a);
7 Y, q5 W" m# [- P0 m int fb = find(b);' M+ C( o2 Z8 l: x
if (fa == fb)
$ C* P: Y) P: m+ f return false;
2 @8 R9 }$ I+ m7 d3 o' l: T0 ^, c f[fa] = fb;
6 H' K" t3 R, p5 w" K% B return true;* a& C$ ?- z" G/ d/ J, y
}% {% ]9 X3 L [3 }
$ y+ h' z. }" c- E( P7 ]
public Map<Integer, List<Integer>> sets() {
G$ e4 {3 x8 Q6 z Map<Integer, List<Integer>> res = new HashMap<>();) F1 q2 C$ I6 X
for (int i = 0; i < f.length; i++) {
& v& C3 F1 s, |" N" c0 j) Q: b% e; u int fi = find(i);
" y* I `+ ~2 ~* ]9 }$ E" Q8 X5 ]+ _ if (!res.containsKey(fi)) {
1 z3 a: q" W9 ?9 G- C1 ] res.put(fi, new ArrayList<>());) H9 ]4 Y. F' f
}
/ t6 n3 `# b, @; ~, Y" h res.get(fi).add(i);& [! H2 C8 U9 l0 e t3 d4 ?: T
}
# D' F9 a6 T& j; b+ { return res;4 u4 ]( Z6 B8 e( e" Y
}
- }2 E6 q0 h; J% ]$ ]
, E8 F' J/ J8 F4 ?7 ^3 @8 I6 }4 J z private int[] f;, R0 Y5 @3 K* q& ~9 o$ _
}
% e) U) y4 v4 D; s
4 W% a. s( A( M8 |2 Z
6 s1 s2 L3 T' n: B: O4 C0 R" `class Solution {8 x, `- f9 n2 {2 d& n
public boolean gcdSort(int[] nums) {6 D5 e# S" \5 S: Z+ D& q
Map<Integer, List<Integer>> set = new HashMap<>();
K4 {; W1 Z3 o8 O/ k for (int i = 0; i < nums.length; i++) {
* F2 X5 O# N1 [6 u for (int j = 1; j * j <= nums[i]; j++) {
/ L3 j$ v d) R* f8 ~ if (nums[i] % j == 0) {
1 a! T3 D; |2 R4 r if (!set.containsKey(j)) {( h" L, _& V# d9 [
set.put(j, new ArrayList<>());
3 x+ i. ]/ q8 O6 R }
! b- f* O2 x' F% j0 _2 H set.get(j).add(i);3 \9 O3 w, Q, ]) [) {3 ?
if (j * j < nums[i]) {4 z" h9 }+ @4 f
int k = nums[i] / j;
8 S0 i7 W$ ]; ?5 n1 e if (!set.containsKey(k)) {6 _- A" q2 l" K+ W, n. C- d; X
set.put(k, new ArrayList<>());
3 ^( m4 |' G% I }
5 S$ k1 b. Y5 s2 M, [ set.get(k).add(i);
! j$ p' h5 ~, g2 a1 s }( X6 P4 C/ ~$ D$ p! [7 A$ I
}# Y4 f# F- v' s$ h! a
}- z0 E! `6 w: `/ _
}: K6 L- V" n& P8 ^! d
7 _5 ~1 Q! B) m, W. U6 u4 n
UnionFind uf = new UnionFind(nums.length);1 g" e% }$ Q: @/ {2 {, C
for (var e : set.entrySet()) {! v8 {- _. i0 \$ P
if (e.getKey() < 2) {
M' w; h, `) V( z continue;
4 K7 q: X8 C: Z# E5 C' _ }& ^* @/ f1 h9 k* R7 I- W
var list = e.getValue();: S+ o2 j2 m7 I2 d9 _+ K
for (int i = 1; i < list.size(); i++) {$ G: _: f. m: Q: Y+ |5 ]
uf.merge(list.get(i - 1), list.get(i));/ D E* `# ]7 i/ A
}; b4 M! L+ P$ S/ N1 C6 [2 M& D, M& I9 L' L
}
, _: l, y4 R/ D* A% @' I; v D var sets = uf.sets();+ O: Z7 B8 H& F9 }3 M! ]
int[] res = new int[nums.length];
4 ~" E+ ~% n' b( v2 V+ v6 g9 R for (var e : sets.entrySet()) {% i. i; P: Q( b. A* X3 C" i' z
var list = e.getValue();
" e$ O1 q M& P var sortedList = new ArrayList<>(list);+ J/ ]* e, {+ C0 F% {
sortedList.sort(Comparator.comparingInt(a -> nums[a]));- f1 _$ A- }' ]
for (int i = 0; i < list.size(); i++) {7 L' u2 s8 ^# A" p+ D1 O7 S' g
res[list.get(i)] = nums[sortedList.get(i)];
$ o7 U% y8 `2 ~# A9 B }
6 a) B, S! _, O$ o }" w# {: C% N. F: @ B1 j6 R% L0 W
for (int i = 1; i < res.length; i++) {
5 A! L& a* j# ~) x3 X if (res[i] < res[i - 1]) {' {, M, v: I0 ^2 M
return false;8 d9 P8 u* i+ r8 I
}
4 C1 D. `1 l& |( } }
8 a4 g2 r. z; y7 o return true;+ y- v# D* m/ k6 y2 d, c u' h) D
}
9 R1 M! n: H: D9 x; i} |