登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计特殊四元组】6 S) D2 y ^$ f/ J
解题思路% H( @% b; x9 ?+ A% I1 K! F
签到题,枚举即可。
" V1 v2 D+ [* k. D) b' G/ J
/ ^3 N. C7 ^2 F- s" s9 H7 T- P% q# ~代码展示+ D. C/ \2 v$ s2 s" @9 b3 T% G
- r# e: q# l# Y b5 t9 L3 lclass Solution {
$ P" X8 o7 [! W. O public int countQuadruplets(int[] nums) {$ N; E) ~ L* R. T- z
int n = nums.length;: i0 O# d& x2 U0 e7 p5 Z
int res = 0;8 b4 Z: c( E- J% H: j* U, C
for (int a = 0; a < n; a++) {- Y N/ A% y* T3 ]- M6 R' @
for (int b = a + 1; b < n; b++) {
- W5 _" R- m$ g9 ?1 L; w5 `, ` for (int c = b + 1; c < n; c++) {: ^$ `7 k* i' \4 [
for (int d = c + 1; d < n; d++) {
& C% ?) g& n+ z& b! y' i if (nums[a] + nums[b] + nums[c] == nums[d]) {' W5 I& R- |' F; s- b0 l
res++;
U1 b' J' ?+ m# v2 C6 N! e& c }
! _% o3 n& o* Y% w, k }0 B9 |1 F. _: z
}
6 E( p' v( S' w1 V4 ?2 M }& n, Z; Q& S/ Y! p% n. F
}- \3 }5 f4 [* S3 G
return res;
7 k( `3 l% A3 i; Q+ }$ m0 N }
$ D# k4 e8 Z1 y& N9 O* l8 y5 ~}
8 M$ p8 o- o: o3 y% p4 R% q# K9 C; K+ b7 o
8 N0 S' ?1 G2 W& J' R+ Y
/ u( V6 F' k9 c% h
8 n7 f1 e# r" X9 f; M7 B
【 NO.2 游戏中弱角色的数量】
9 V4 s3 ^8 h' Z1 ~" z解题思路6 E5 K5 B& M4 T. u
按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。" W& H, d& C# m" o Q4 h4 N
. _' w# ?4 r2 A, E# J& u' ~
代码展示
7 s3 B- E9 F, c6 [: N
* U1 z j" v( i6 P4 S& |1 q! q0 oclass Solution {
4 w* e+ B# t8 C0 k+ j4 c4 p5 m public int numberOfWeakCharacters(int[][] properties) {
! p8 Q" G0 J! Y) y- q. X Arrays.sort(properties, (a, b) -> {, l5 ^8 Y: X! |4 C9 U+ s
if (a[0] == b[0]) {% c6 g3 }- g- A- {, \
return a[1] - b[1];
4 [& T4 k; Q% _ L; }1 F, ~ }
' W: \ ]+ g/ [1 x8 N* R return a[0] - b[0];
3 {1 A6 Y" `* C5 \ S+ ` });
8 w" E+ T( L0 j" M- | int res = 0;
2 z0 B. K* P7 ~0 a4 l8 i# h+ u1 _3 x4 ^ int lastAttack = properties[properties.length - 1][0];% p5 q. c* W+ `) P
int lastDefense = properties[properties.length - 1][1];5 v3 j; r3 D9 ^& m
int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力; a4 t& M* T# N8 B+ K
for (int i = properties.length - 2; i >= 0; i--) {
1 i5 d! k2 _ n/ Y$ D+ Y if (properties[i][0] < lastAttack) {% r( J ?$ ]5 o; [8 p' F) L
maxDefense = Math.max(maxDefense, lastDefense);7 m: e* h9 E! ^) [9 I8 y
lastAttack = properties[i][0];
" z t2 K/ _' _' `0 ~4 i lastDefense = properties[i][1];; L0 n0 p6 M8 Y9 X0 Z. d4 D. Q
}
" q- r/ u; [, M K if (properties[i][1] < maxDefense) {
1 C. p3 G% ~ e9 G: ~# C6 i# G1 } res++;( M8 \( q' g; W: z" I0 ] D M
}, ]5 `9 ^& S2 [6 Q3 B
}
4 N# U# k# F- k/ w: N0 f return res;
7 L+ \& G# R# [# B& { }
8 A9 _/ Z+ L0 }: b6 h; p2 B, Q}
0 ^6 ~9 a- g, a, {; s
7 N" F" E; O6 u2 k7 S) K
! R) V# b, I3 E( }( B! ~2 e【 NO.3 访问完所有房间的第一天】
( G8 _, f3 z/ ~* h6 x* w3 o7 ?* A( `2 V) Z8 c
解题思路
5 {7 E: l O3 }3 Q7 N" ?动态规划,dp[i] 表示访问完第 i 个房间的最小天数。
9 X6 S1 ]. }* s) F7 H
4 I9 F: L; _1 P$ G* H代码展示
3 V5 b2 \ X9 x# f: P1 o1 T1 U1 j, n) L; N% _7 M! _
class Solution {
+ }/ a9 j# p% l; a3 k public int firstDayBeenInAllRooms(int[] nextVisit) {
+ T q) D8 Q4 x8 a4 I int n = nextVisit.length;7 p) @2 @; J# K1 Z! [2 \4 t% S
long[] dp = new long[n];1 O- e. [0 ~2 N9 w: S& C
long P = (long) (1e9 + 7);. ]( S8 E. E- ?6 x# e! l
for (int i = 1; i < n; ++i) {
. C9 g6 m6 j" K6 B" S dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;
+ {. A& q. a4 r5 c2 o+ `0 A }
6 A7 g6 j9 y+ I6 l% h. I5 r return (int) dp[n - 1];
- h! c; s3 H& T$ J: _ }4 u9 Y/ n4 @2 I$ o- M9 @
}
4 a0 q$ ^4 J$ Z7 `- y8 ?8 f7 l$ l/ r5 \# V+ n
【 NO.4 数组的最大公因数排序】
" Q1 U5 H6 G0 j0 `# ~& A! V
8 Z6 z5 z0 ?+ R4 N) }0 ~7 W/ d% w解题思路( f3 f! _8 ?9 A% k$ Y* X, v
只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。5 T7 U1 @6 q, I9 s3 ]
5 _9 z% T# z1 F' C3 ?$ B$ H# O T! V9 b
代码展示: I! l3 R' g* _1 a
+ [2 I7 X5 \1 s& C! qclass UnionFind {: n& D/ V% K) g1 o8 O; b0 L, M
public UnionFind(int size) {
1 W, p; ?" ?$ z0 ?7 ^% [ f = new int[size];
% ]' F2 Y( j9 x7 j: O Arrays.fill(f, -1);( j, _) N0 H" f
}9 c( _! u: j6 U
% [5 V$ L" P7 g) \9 e7 T public int find(int x) {
5 Z! g V3 G/ ^% t! v9 ^7 _ if (f[x] < 0)+ N' w1 a0 D- C$ T
return x;6 v% E2 S4 z5 M
return f[x] = find(f[x]);
. W7 K8 g# t5 v. L# }! h }
1 ]- y: l: c+ d0 \- H! f; ^. a) J$ G+ o% v# w: J( Q: i1 ~ L
public boolean merge(int a, int b) {
6 y1 t( k5 w( f) X! z y3 W int fa = find(a);
" o- O; o1 k2 k4 }+ ?& Z4 _# y! F int fb = find(b);
) n) h v: W4 j5 n' t" v if (fa == fb)
' y, N. ~( e5 L' T1 U7 { return false;
. ^" N; C* L" U; A f[fa] = fb;- D2 K) T1 y8 ^
return true;
/ C7 y4 X0 [6 k: t7 R4 ^! I }" @$ Q" q9 B0 e0 Z9 L7 H d
" R! j4 n, w! p% a# h public Map<Integer, List<Integer>> sets() {
6 M% n- j U8 D2 \, K% |" ^ Map<Integer, List<Integer>> res = new HashMap<>();" Y4 v& ]( d! N ]
for (int i = 0; i < f.length; i++) {
. a. W/ A4 L' t' s# A int fi = find(i);
6 ?* n8 h- c0 T6 H7 L* x, } if (!res.containsKey(fi)) {& I0 t' R) c, F6 S% W. i l! v
res.put(fi, new ArrayList<>()); w: j7 b Y _. X
}
) E: C2 [3 x3 P' P) Q6 @ res.get(fi).add(i);8 Q- W/ N4 ]; |4 g+ \
}
# L6 p5 P7 G9 i' M( s M( @! ?1 ~5 k3 q return res;- w4 p+ `+ o; f
}
% K4 N( `; P. ]6 C7 h6 q: A1 a7 o/ E! n0 k% u4 U- k( {
private int[] f;. [0 g( X7 a0 s1 ]" M6 l) a& Q
}
! f* L! g$ s9 J3 t3 F9 H6 W. P! T' h5 w
7 ~2 V" I4 _& V
class Solution {
! y6 X% S+ d; x [7 x public boolean gcdSort(int[] nums) {
8 ]0 d4 a5 I. [ Map<Integer, List<Integer>> set = new HashMap<>();
$ T1 g( X$ o, Q+ E( G for (int i = 0; i < nums.length; i++) {" I8 W. ?$ R6 c" k( U
for (int j = 1; j * j <= nums[i]; j++) {9 T, F, Y$ ~! W3 I
if (nums[i] % j == 0) {' ~: B y# R2 g/ _
if (!set.containsKey(j)) {
6 P2 _5 `- f9 p& Y set.put(j, new ArrayList<>());
7 _3 B& B# s# I# D( V }
8 c, s1 k9 H4 F, v. r* D set.get(j).add(i);
' _: Y3 q( |# H# l if (j * j < nums[i]) {/ |$ @& v1 ^6 y" g. g& Y
int k = nums[i] / j;
6 U9 h% N% B) O$ f! E! J: [ if (!set.containsKey(k)) {
; D6 r5 i- v/ C4 H1 J( X) Y set.put(k, new ArrayList<>());$ q% P; c9 K+ E; r _6 u
}- Z& |3 ~! M/ W1 ^
set.get(k).add(i);
2 B8 o8 B3 |: ?6 a' A) \ }; H [$ T! P, {" M! e2 k4 i
}
' x! v/ A" w3 J* n& G }, x" i* V5 _7 g# z1 m [
}6 O, ?& y/ \( n1 c- K
, Y5 q& d5 ~& Z7 q* u1 I4 v& e
UnionFind uf = new UnionFind(nums.length);
& a2 Y6 O( S: ` g: X$ T3 W; ` for (var e : set.entrySet()) {3 W. \! ]! B9 W3 y4 v
if (e.getKey() < 2) {
4 [4 ^/ T2 ~+ v7 F4 b continue;
4 c9 r O2 I& w2 t u }9 k4 O4 R: {4 h8 t% Y! |
var list = e.getValue();
% U5 T! L8 n9 t( p8 q' c% u for (int i = 1; i < list.size(); i++) {! p4 e1 X1 I4 }- Z
uf.merge(list.get(i - 1), list.get(i));* R: T: ~& R7 n( e7 {6 N; r
}; H8 k8 X9 m4 q8 ~9 C7 G1 s) ]
}
* V0 `$ K! V$ h: T var sets = uf.sets();4 p" J& i" J* N8 Q$ M
int[] res = new int[nums.length];
# y3 @: m3 P$ L0 y for (var e : sets.entrySet()) {9 @. ^! \) K) N% D* `2 W- z
var list = e.getValue();. z! Z" V3 d* |9 o) Y. }
var sortedList = new ArrayList<>(list);$ l5 f& e4 M2 X
sortedList.sort(Comparator.comparingInt(a -> nums[a]));( {3 S4 I$ r a" ^- x: ]
for (int i = 0; i < list.size(); i++) {
) j5 j% A8 h5 g6 S0 z- T0 g* ~6 p res[list.get(i)] = nums[sortedList.get(i)];6 g) C: S% L4 f' w) G/ {" X# B
}
+ I, L: k7 b a5 V$ J |+ ~ }
* n* z& P: Y) @ for (int i = 1; i < res.length; i++) {
8 S7 M' D9 u: F: J" u* P. X if (res[i] < res[i - 1]) {2 v) \. d, p. B6 x3 E
return false;
# D# b' b9 _. ? }
/ H' v8 l6 a" Q! c" U$ M% T }, M2 L0 { j# C' ?9 l7 U2 e
return true;/ x& C/ f7 v: N; V$ p) Y, v) I
}
# z5 J, `1 E$ e1 g) O' ?4 z. r} |