登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计特殊四元组】
# g: h- s! ~+ B5 G s解题思路
) |+ I5 U* Y |: s& u. K! Z4 o6 j签到题,枚举即可。
3 G! h3 a- j* ~8 i" P
: l4 e8 s& _0 Y2 j$ x( h4 R1 a- }代码展示
+ B- W! y5 t, v% B5 \. {, w2 E& w @3 R" x6 N
class Solution {4 |5 U6 V0 o" f) u( c
public int countQuadruplets(int[] nums) {
( i S% P4 j0 F: i0 k4 K4 { int n = nums.length;( ~4 s9 h) O# G( c6 F/ z/ [
int res = 0;
. K; v" f7 f8 w8 \, ?0 S: l for (int a = 0; a < n; a++) {; v# ^8 W7 z0 t" Q5 R
for (int b = a + 1; b < n; b++) {, z2 t: Z2 ]2 `3 u! N% i, A
for (int c = b + 1; c < n; c++) {
# M# U% a- X' H. i8 z& i8 d for (int d = c + 1; d < n; d++) {, b2 {7 U8 A' X. u. h2 s0 i
if (nums[a] + nums[b] + nums[c] == nums[d]) {5 y! o9 n7 H) g h3 I
res++;
2 n/ h( z8 Z8 P8 K \4 z }# h0 E' E" |" d5 F/ ]4 D% ]
} N5 q( L4 n' N l6 D
}
) A. P( }1 U7 `, G }9 r1 z3 s3 H/ {; C+ q
}
2 v: @: n( V) f7 Y2 G. [ return res;
" P6 V5 M9 l% }) d$ g }$ Y+ P! i) E3 M5 J; d
}! ~- H0 @, b( q0 u. O
; g2 @' Z$ r: i4 [% F3 |
2 U) M# S g9 m0 P# Z1 G; `. `2 G" I
0 m0 p9 d( Z; K0 J/ P
: E, J3 Q$ x% c; M* e【 NO.2 游戏中弱角色的数量】: Z2 q* w' O8 B$ a& D$ q3 ]
解题思路
* d+ u9 J9 m$ h, S" Y; l按照攻击力、防御力从小到大排序,然后逆序统计即可。要注意处理攻击力相同的情况。
5 e8 |! t) b; X0 x1 c6 @, \: e% Q/ X" B H: W1 y" |
代码展示
- T$ u, c" t; h2 H9 I
3 q$ X: M: s. k8 C0 {# Xclass Solution {6 A; p3 F" Z+ G
public int numberOfWeakCharacters(int[][] properties) {
& {+ M- o5 }6 k, r6 t Arrays.sort(properties, (a, b) -> {
" P( u. W, G; V6 X if (a[0] == b[0]) {
; d7 t3 V; @" P/ l" { return a[1] - b[1];8 Y0 P% P7 ?0 c+ V' w$ c
}
$ Q% I8 C$ F K4 d4 `7 R: p- Z return a[0] - b[0];
# |! l5 D: d; @# J' @% n2 K' y, w });& z0 Y8 g+ n* {/ o2 M: w
int res = 0;) t5 q! r. K, p+ N& r0 v( b. W
int lastAttack = properties[properties.length - 1][0];9 u9 @$ e2 I& |
int lastDefense = properties[properties.length - 1][1];
, ^+ E* x: _" B s+ W3 ?1 B7 N int maxDefense = 0; // maxDefense 表示大于 lastAttack 的角色中,最大的防御力: W7 j b+ r! h" n# t* F
for (int i = properties.length - 2; i >= 0; i--) {# w9 g& K$ N- {6 O
if (properties[i][0] < lastAttack) {
0 L) y+ Q! e; H2 i maxDefense = Math.max(maxDefense, lastDefense);
4 j1 |- E* {) V+ n7 A: {6 D lastAttack = properties[i][0];
2 X0 h! f7 e- z" O9 Z" w% `0 m lastDefense = properties[i][1];
0 L5 D: R# Y2 l8 G- f$ [+ A7 @# a- G }2 _6 f. G" p' L+ }4 B |, ~7 P; m
if (properties[i][1] < maxDefense) {0 h1 T. P4 p) i( d+ [- P0 Q( j
res++;
1 @2 d9 p2 i7 R! l/ y }. N: a7 \; b4 f
}
; B& u- P% _: p8 m0 y return res;, Y( N7 p8 z8 r0 W) D
}
& d$ ^# f L) H}3 ^, \5 A# f& ?7 o9 D. l0 x- } w
; s" @3 d* h4 S8 [3 {7 x
, L: H, I7 C5 C; L9 N# I+ R3 ^
【 NO.3 访问完所有房间的第一天】1 G6 ~2 R& a4 U! [0 C/ c
: T, v; A4 T2 M, X; Y: ^% F解题思路7 z. i4 Q V: `+ g$ e) G
动态规划,dp[i] 表示访问完第 i 个房间的最小天数。% c* k; c' i2 ]7 o1 f
+ L( t- C" ]) D }" s: h代码展示& u: } ^4 Q: [3 x' i
, L8 S3 P8 \" P
class Solution {
) i: o$ i% W& Y1 q public int firstDayBeenInAllRooms(int[] nextVisit) {7 |- ]' }/ O7 E! y9 p
int n = nextVisit.length;. t& A3 U) E- K2 p- N
long[] dp = new long[n];
* M' O, P- ^$ m) {9 | long P = (long) (1e9 + 7);+ g+ K: B+ @2 u/ t" r
for (int i = 1; i < n; ++i) {2 c+ W, j/ T0 m7 l! I
dp[i] = (2 * dp[i - 1] - dp[nextVisit[i - 1]] + 2 + P) % P;
V! m) t* `4 y4 m& s; a$ A/ a) C }& S5 v+ X+ Y! T+ Q" @5 k" w
return (int) dp[n - 1];. f" \$ p$ M# }
}
9 i5 T+ A9 |0 n5 \8 A}
) o1 I7 q, p' L; F' j& {/ Z/ ~6 x* ]5 h
【 NO.4 数组的最大公因数排序】
' X$ B! t& {& v. x- q' I R: Z! k. C1 D0 Y7 o" A* u( k
解题思路
1 Z6 V" n T- C7 u6 U只要元素之间有公因数,那么他们就可以任意排序。所以我们将有相同公因数的元素排序,最后再看序列整体是否有序即可。
" l9 q. ~) ?/ A' f% t" g
) c# `) |6 r$ k9 _2 A) K( d( x/ G' w1 V# z
代码展示
) Q! F% e7 V" ?* r: B6 ?! ^ }9 B0 N' |7 h0 J" \4 S0 T" B
class UnionFind {
9 ^1 e K. D0 h9 \ public UnionFind(int size) {, ]! ]- r" m4 s2 J0 T/ ^
f = new int[size];
9 f- C; T3 t) ~# }- e) m' ` Arrays.fill(f, -1);: B) y) [' i5 I4 d
}
0 O4 E7 I+ T {& b# {$ C; J7 ?9 h
1 O. f" `8 c+ c k1 o4 E& I6 {) E: K. ~ public int find(int x) {5 ~1 M0 y. T+ W. k
if (f[x] < 0)( k ^7 j. P4 I0 i; A& n
return x;6 ]! D* A. O% F6 k6 t: M
return f[x] = find(f[x]);: [: b* N$ N% [3 N4 n& u+ ^
}
, r) G" n: _! q- \" g. A! h; [ {) ~$ s
public boolean merge(int a, int b) {
! A7 Y) y0 Z2 f7 j int fa = find(a);& Z9 s2 d; k! L( |% t
int fb = find(b);
3 i$ X7 \+ B" m" _* b8 s if (fa == fb)1 e1 n% i! C/ w M" r
return false;" X2 W1 O3 Y* C4 D8 E5 E: x
f[fa] = fb;
3 A7 Q/ N% p9 l/ J return true;7 b; ?" W+ U# I. H1 N
}4 U, J, K) g. ]
7 o6 B& ?+ `) [, ], {- l public Map<Integer, List<Integer>> sets() {
. r! o+ V" z) G, e. f5 }9 q1 \ Map<Integer, List<Integer>> res = new HashMap<>();
i( O; \& v* u$ ^3 `4 j+ e for (int i = 0; i < f.length; i++) { ]) s! q% P! f
int fi = find(i);: B, ?6 c8 P f0 o5 }/ x
if (!res.containsKey(fi)) {
. o4 A1 @1 X0 [3 y& F! ?9 V- i res.put(fi, new ArrayList<>());, e0 \; U0 `# `
}
* h& L1 K- a$ l5 k; u res.get(fi).add(i);
* c5 }0 t3 I+ `- D# U2 W- `& X }, S. s# V& \3 t; G
return res;
& d9 A+ C. H- Q) d7 { }7 \- ?0 F' ^7 ] A2 u8 W; q) [
2 ^/ m' m" w3 o9 Z2 N3 Y
private int[] f;$ R: T' k# R9 @) t
}
1 ~" m3 T5 q1 }0 f2 d# y% Z8 m6 J* m4 D' S8 h4 l1 G
. R; d d/ h5 {+ C$ G; u" b/ Jclass Solution {
8 u6 n( Y2 ?2 u9 I* B; {3 f public boolean gcdSort(int[] nums) {) G6 |4 J# p7 r, K8 O% c
Map<Integer, List<Integer>> set = new HashMap<>();
1 V$ W# `( l3 s/ } X. n; z for (int i = 0; i < nums.length; i++) {
- H4 n& n% Z" A+ Y for (int j = 1; j * j <= nums[i]; j++) {
4 z5 O3 E! f( k7 u4 x1 n1 w if (nums[i] % j == 0) {9 @( ]/ R* `+ ]' ?+ S2 ~! c* n
if (!set.containsKey(j)) {
$ f' z- Q3 \: `/ R0 k( N+ K set.put(j, new ArrayList<>());
# `) U7 u+ [9 e9 H5 i: J7 w G& e }1 \* A) K9 w" `/ ]5 n4 M
set.get(j).add(i);
; k$ _% w0 q+ v% |& F1 B if (j * j < nums[i]) {
$ e& _2 h# s0 `: g5 J3 x; L+ w t int k = nums[i] / j;7 u; U6 g! U; z% X4 a, S, x5 Z
if (!set.containsKey(k)) {' p# L f1 p- K0 A+ @% w
set.put(k, new ArrayList<>());0 z9 @+ f5 j: g* i
}6 v9 D) t% Q6 N% c# m2 n _' f
set.get(k).add(i);
2 m' c7 ^ v9 B5 D3 q$ T }/ p4 C$ Z. T) K
}
' O' \1 w7 t# b ?2 M }/ D# D2 r6 q7 ~9 G/ M
}
. j1 K, A; p' k6 S/ @- J; D( L: k7 i# a
UnionFind uf = new UnionFind(nums.length);
% w. U8 M0 T2 ~: R for (var e : set.entrySet()) {3 _+ F" i# j( v
if (e.getKey() < 2) {
5 n5 P8 q4 L7 N: e5 ^ continue;
5 ?) r' U- A4 X o }9 o$ v" A @5 }
var list = e.getValue();$ e3 y# v# A% |, G1 ]( D; y2 V
for (int i = 1; i < list.size(); i++) {) e9 k, ?! [( o9 \6 D P
uf.merge(list.get(i - 1), list.get(i));
( r0 N% \0 y& Q* B8 w j }
5 x: A. F! u! ^! { }& N: q% h5 x5 q2 {$ R
var sets = uf.sets();, r% U: |$ Z, n0 [, `
int[] res = new int[nums.length];
6 m- H" i u+ Y9 R5 A- `, {# K for (var e : sets.entrySet()) {4 R J0 G' v% c
var list = e.getValue();$ h3 Y$ H' q6 O2 g# ~3 O
var sortedList = new ArrayList<>(list);
% }# |: l! I" v/ u sortedList.sort(Comparator.comparingInt(a -> nums[a]));& U! g* U. F& v
for (int i = 0; i < list.size(); i++) {
: K, q2 e, c3 u. b/ Z# M# Z6 w res[list.get(i)] = nums[sortedList.get(i)];
- Y: c6 d" D2 d! H. b0 d& e' A }2 s6 ~/ e! v& n- N) ~0 Z) ?
}, o1 M+ v9 ^- Y1 u
for (int i = 1; i < res.length; i++) {
* m. y; J( r1 w7 C, H4 S( r0 F if (res[i] < res[i - 1]) {/ ~5 E+ f# ~) y& K- H I
return false;4 Y$ a* e) K9 ?6 ~# M9 ~
}
+ C' v* @: U" [& P# M }
, I0 q4 k E+ m8 y7 Q2 u2 l0 e, [( D return true;
0 I& |( z6 g4 O4 X# B }; x2 ^. Y6 {/ X; K' v% T; }
} |