登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计特殊四元组】
) {+ N+ u1 ~* W解题思路$ [- O c8 J& Y$ Z0 z
签到题,枚举即可。
4 U9 m f% n- W& u1 q3 T! B" ]; r+ e
代码展示
( u }0 Z- ~ V5 d* ?8 `6 N1 t2 J$ F; }- n
class Solution {
$ K% \- v5 M: U& U' } public int countQuadruplets(int[] nums) {/ M" w- ~" r3 ~. N
int n = nums.length;
9 L. F1 o' p6 j int res = 0;* {# m F/ H$ ?
for (int a = 0; a < n; a++) {
0 m3 o" E% r/ A5 o+ ~ for (int b = a + 1; b < n; b++) {
% T* @1 O+ J$ W3 n for (int c = b + 1; c < n; c++) {
1 Q( B1 i3 v. I) Q! p for (int d = c + 1; d < n; d++) {7 J/ L1 [ B" I! J. o
if (nums[a] + nums[b] + nums[c] == nums[d]) {
! l n7 p5 F% v5 d res++;
$ }6 Y$ g! ]9 s8 E- a) F5 k" Z) L) U }
& n- P6 y; B1 e0 W) d/ m }
* x# N2 q% x. m! B; d }8 U% G1 q3 ^, f& j- `. q" f
}
( {3 E0 o% O- n3 o/ C }" n$ ^, K9 v5 _- l5 z4 {
return res;
7 f1 w. y0 V2 A' G5 Q( D1 z3 B }
0 f1 t5 p% t4 c) w: o; l- W}
. @6 o- T; h7 Y& P U# Z# p9 J
9 l3 @5 d1 ]& k3 T5 o# @4 a
5 N! A' A: M( B0 S$ n1 `. r& T+ @# P( W2 {0 |
6 D1 Y6 @( ~. Z5 v【 NO.2 游戏中弱角色的数量】
% K- v. q5 f% l解题思路
: s, s& h7 h, W+ R8 u( m3 a/ G5 L按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。* y4 e/ x9 K- B; D. @2 l
9 @9 X" X& c/ n$ q) O代码展示
; o* A# D* _8 K' y9 ~4 V; O9 M. f( e' F* o- h9 Q7 c( f
class Solution {3 \3 a$ q& S. M7 W/ ]
public int numberOfWeakCharacters(int[][] properties) {
5 T5 s* A- ^4 N& d, M* b Arrays.sort(properties, (a, b) -> {7 M* U. v5 s% Q% d- y3 f: b
if (a[0] == b[0]) {
# g4 N3 r* ~, ` ?* D: t g9 O/ T return a[1] - b[1];8 ^8 g ~ P' g: ]* @
}
; S1 A( M# R9 ` Y4 l, n( M return a[0] - b[0];& c( ?9 D4 l9 y+ Q) `6 D8 j$ \( J
});- H6 G) V; A. r6 M4 K
int res = 0;; U3 |; C; y; K2 b3 z
int lastAttack = properties[properties.length - 1][0];
1 n- @$ F5 f; N/ _% [) t int lastDefense = properties[properties.length - 1][1];
. R+ Y) L; X) l int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力- d4 W% k* J' y' b% q9 _" A
for (int i = properties.length - 2; i >= 0; i--) {
% ]8 w8 o3 x1 w/ U) F3 L: Y6 ? if (properties[i][0] < lastAttack) {" ]' g, M# v: f) k3 U
maxDefense = Math.max(maxDefense, lastDefense);! O g) D, G" \- e# ^- C6 I
lastAttack = properties[i][0];' w$ ^/ m1 M/ @) ~* J# N3 w" N
lastDefense = properties[i][1];
: E5 L8 B( v% s$ U. e9 @- T5 j }
% F: j) R8 C" z! o: O if (properties[i][1] < maxDefense) { m' ]1 W+ w4 y: n+ k+ a
res++;: C7 o, g; ^; y7 J
}
, a# e( G1 h2 b9 D1 b9 e, u }
Q+ N u1 W$ |7 P( D3 _ return res;
' G+ `. B+ d6 b+ [$ t, r }
- j0 K. h; J$ P# q/ b}
+ Y7 U( g5 G8 M `3 E! F4 Z
- x. K7 _0 z8 j z
/ n) Y2 e' {. B! t【 NO.3 访问完所有房间的第一天】4 {/ ^1 x+ m4 U1 d2 ~/ T* n
4 Y1 _6 r; j! S解题思路
" u; H. e2 R0 H" H9 I" c动态规划,dp[i] 表示访问完第 i 个房间的最小天数。- }8 B( p2 e4 @
' _' b+ ~: L) H代码展示
3 P# }# e! C3 c& v% z" u( g5 Y( V0 Z6 P9 I6 F
class Solution {+ \7 }( N) H! o. ~ r; Y
public int firstDayBeenInAllRooms(int[] nextVisit) {
/ B0 f0 A- u! x3 C* `8 B int n = nextVisit.length;$ v8 C' u( _: e
long[] dp = new long[n];$ N. b. O7 x* J/ T$ f
long P = (long) (1e9 + 7);, Q/ p0 |5 b6 u( t% q& ]9 ^2 c( n
for (int i = 1; i < n; ++i) {
( E' r/ M) [: E$ s1 ^: u* [$ W dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;! f5 y8 \4 V0 @6 m8 S/ r3 o: p! V" }
}
. ?$ z* U- J- g return (int) dp[n - 1];$ l( r. p. V( V
}$ y; Q2 L& @& [0 h/ X0 V8 q. b+ }
}% p! i1 M2 s7 P. ?+ \
# r, c0 @: o( w9 t( Q% W4 |
【 NO.4 数组的最大公因数排序】4 v; h% P8 m5 C( F" X% O; B
; K" F" v* l5 B% s; J
解题思路# O% }7 ~) _$ [2 |8 U8 B9 t2 ?
只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
( k/ t& r5 n: L! C: H
4 X5 Q. W1 B N/ ^* N0 I
: A4 u+ m7 t. t* l; C! {4 O" x代码展示. D( h5 {/ l2 `
! a, U. S% a8 S9 G" e
class UnionFind {! S& p& }( P4 [! A$ Z$ l& I
public UnionFind(int size) {: W4 j4 n" f: P: }
f = new int[size];% }0 I& f& q* F: i) T
Arrays.fill(f, -1);
2 v2 w8 {0 h* J! Y2 V+ S5 d }% X- [# k* b& |5 |2 i: `$ t
. ]5 W/ I. |5 s J( t' g3 | public int find(int x) {
+ y2 Z' S' n2 `* g( Z: ? if (f[x] < 0)
2 |! o: I; O5 K6 a3 w' T return x;
2 _* P7 L/ U1 ~6 F# c- @' y return f[x] = find(f[x]);
3 }5 u8 P. R T$ i3 @- ` }
- z/ U( C% E9 b* ^6 ?; n
4 {! B a8 T- h; L4 C. q9 B public boolean merge(int a, int b) {
: w+ E7 A2 F# j B+ [; _- T; M3 S+ o# y int fa = find(a);
. e2 `6 I. x' X! ^( A5 U int fb = find(b);3 e1 G6 |0 i5 ~1 {. n- ]
if (fa == fb)
; K- ]& \$ ^6 x+ N: ~ r+ { return false;/ d* g1 r. }7 o! q8 e4 A
f[fa] = fb;+ j7 u) b& m5 Q0 c$ w# u; |
return true;& A/ t4 @/ B" |, L$ p! V2 G, [
}% o) T$ B+ o- N0 h, @- w& P
! I- V! [; m1 A public Map<Integer, List<Integer>> sets() {
/ `/ w5 V" L9 L7 T Map<Integer, List<Integer>> res = new HashMap<>();
# H5 f, P; F, u/ [' k2 x$ O# V* Y for (int i = 0; i < f.length; i++) {4 `, J4 X h: f& [5 n; L
int fi = find(i);
) ]# }. k5 v7 T$ Q# y$ x2 o if (!res.containsKey(fi)) {
; f! Y5 @& q v" a res.put(fi, new ArrayList<>());
0 g1 ^! _9 G/ r3 p/ s }9 A- p' h" F* A
res.get(fi).add(i);
4 Q6 K3 E! s( t2 s }
$ p3 N1 W* i f0 p1 w3 c4 p return res;
$ X( \7 E1 d1 u, R1 I } w0 O* Q0 }, ?2 N$ b; f
. z# X' |' _1 @
private int[] f;
: v" P& w: y- U, } Z8 o}
2 _! T0 @* B3 }% y: c6 P `: h/ t/ X
/ t4 N! q% p4 M5 E" b2 \2 }class Solution {5 k! m+ }; a5 u
public boolean gcdSort(int[] nums) {( @* a. n8 p1 g$ C& v3 u
Map<Integer, List<Integer>> set = new HashMap<>();
], J/ a$ I' |# p5 ^7 e$ W for (int i = 0; i < nums.length; i++) {
2 N% _& l4 G/ b6 j* g for (int j = 1; j * j <= nums[i]; j++) {" m. x/ l6 T9 ^' @; D9 K0 o: X
if (nums[i] % j == 0) {+ d( N/ o$ ?: L' F O, ~& F$ [) [
if (!set.containsKey(j)) {8 Q% @' J: F* W$ f
set.put(j, new ArrayList<>());3 x: \. }( n% r/ W2 \3 r7 _0 K: f: a
}$ b6 d. _8 i3 P' B1 t1 J+ U- z* M
set.get(j).add(i);
0 S& k3 T) t5 k3 `$ ` if (j * j < nums[i]) {/ j; E3 j- m5 E" K
int k = nums[i] / j;8 ~6 Y5 Z6 j A6 _
if (!set.containsKey(k)) { L6 S, E7 z1 D/ y9 I5 L
set.put(k, new ArrayList<>());: _- g3 N( _: s: r. U% O
}
8 S- N( H5 E) P7 B6 g set.get(k).add(i);( W# ^3 t5 I3 {/ H: X3 L0 c! H( Y% R
}0 P6 d) ~2 n' R: Y" [
}0 X* F: x. n6 X1 U- |# k7 h
}6 z h! q! C/ f! \
}
1 H; |% ^9 `1 x# l
. R. i8 g& M( u UnionFind uf = new UnionFind(nums.length);
7 v5 N4 G- t N: R* Z7 ^' V- F$ e for (var e : set.entrySet()) {- \" p7 E I) Z. L
if (e.getKey() < 2) {4 O* H- i2 b$ h% r" W/ i
continue;6 Y/ W8 o. v3 ?7 v
}+ P2 D& T9 `7 [& d
var list = e.getValue();
* \* [7 ~1 b0 v4 k+ `9 n* Y for (int i = 1; i < list.size(); i++) {' ]$ O+ [ _ b+ P3 G
uf.merge(list.get(i - 1), list.get(i));( U0 t9 C' w H3 t6 Q
}
3 z, E% N% n) z2 i0 q) ~ P& ~ }4 v7 d3 Z; f! [7 }
var sets = uf.sets();
. T1 x% g9 `4 C int[] res = new int[nums.length];7 O$ |6 T! V2 s+ l; X
for (var e : sets.entrySet()) {' c4 h1 e* B% f/ O1 H4 N9 O
var list = e.getValue();0 \! Q ?: N5 h1 y/ g6 G
var sortedList = new ArrayList<>(list);7 x. `) y; \9 Z+ z3 F% ?0 s
sortedList.sort(Comparator.comparingInt(a -> nums[a]));
; u, c! D/ P4 l7 E for (int i = 0; i < list.size(); i++) {
: a, R+ h( O# t1 T5 c1 L y res[list.get(i)] = nums[sortedList.get(i)];+ a/ ~9 Z$ a4 \6 Y
}- O& t9 D8 h" L3 _% l
}
5 ~) D- [( z: E- R for (int i = 1; i < res.length; i++) {: H4 ]' O' ]% L1 R$ F- C
if (res[i] < res[i - 1]) {% y6 [! l+ M# ^" N' f; R2 h6 T" \
return false;& C. s6 V# v/ S& i/ w
}) f% Y- O) V |( G4 E7 K z5 j
}
& E3 _+ S. J. O$ Z4 a* }- e6 B return true;
6 A+ r* e) E+ \ }
. D. P6 c0 B" W$ Z3 q: }; E; ]- N, D} |