登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组排序后的目标下标】
! b1 l* m! p$ I8 }4 k) ~( L0 S解题思路5 u+ Y I- i3 E3 o) |9 | d& o
签到题,循环判断即可。! Q, {2 j/ K3 _) M* U1 l/ m
# O3 ~- z6 p0 `& E! o0 z! @代码展示2 { v' g9 ?1 s
8 k* G; D8 U! n8 L% |7 v* C8 a
class Solution {' i( k$ Y- L' _% o2 G; q0 h
public List<Integer> targetIndices(int[] nums, int target) {, D& x3 q9 I6 X5 o
Arrays.sort(nums);
9 W7 F4 }! X0 d List<Integer> res = new ArrayList<>();; g; L) u B$ J% h5 f, d
for (int i = 0; i < nums.length; i++) {0 h/ W2 M% S/ I$ _
if (nums[i] == target) {
" R' U; P! C1 l4 w9 [, O! y: f res.add(i); |# S% N9 f* w N) Q5 o% `
}2 `" U* L2 s+ Y6 E$ I
}
" [; o# ~) x' |" Y return res;
+ [3 l# r M1 O5 s) h$ H9 f% x }
- `+ h- o+ t5 t- J; E) G}+ i; X) Z3 t- U
) D- i* |5 P7 n0 M/ w
【 NO.2 半径为 k 的子数组平均值】
/ b0 @8 s6 C# V解题思路& A( t! o! R9 l5 E' u: u
使用前缀和计算区间和。注意使用 long 类型以避免溢出。
5 y: T6 L+ C* D# K/ s
/ b& v5 H3 Z7 g代码展示
6 v; V* F }+ G
5 d# ~. X4 c* k( c' hclass Solution {
. Q: f* B. J/ }& l, _7 t public int[] getAverages(int[] nums, int k) {
7 g, a- a0 [2 R5 ?( P if (k == 0) {; Y0 x% A6 s: k# g# c
return nums;
2 ]0 \; K$ N6 D6 o ^5 K }
@7 M0 o/ ]. l; | long[] preSum = new long[nums.length];# @1 f; o5 H# y; {2 m2 q
preSum[0] = nums[0];
4 T' A: b0 ^4 @7 G2 f7 H4 u: Q. X for (int i = 1; i < nums.length; i++) {9 m: N% a1 h2 @ j" ^
preSum[i] = preSum[i - 1] + nums[i];1 P- w1 y) [# `. ~6 L) [) b
}, G& L ^$ D+ k* T9 b
int[] res = new int[nums.length];5 E( s* m+ P9 z/ z. {) i- u" r
Arrays.fill(res, -1);
0 T5 A% M, l' M8 @' H for (int i = k; i + k < nums.length; i++) {* v1 N: a/ g' s# X
long sum = 0;
- s7 @" s+ Z; H if (i - k == 0) {
5 ]4 m6 R0 v2 K$ n sum = preSum[i + k];
% u! ?% x$ K r. ?! a( l* E9 x } else {; g; o' l9 [3 B2 Z; P6 ~+ J) B
sum = preSum[i + k] - preSum[i - k - 1];. |6 b3 _; I! k# R2 B" L9 t
} Z; }- l* {( c. M
res[i] = (int) (sum / (long) (k * 2 + 1));
& U& j. e6 v0 Y' k }
7 }$ L; k- `- s, @ return res;4 I- {4 ^3 v" b4 @( m; {7 X
}
+ Y0 h' s- I4 k& Y2 d}
% }; Z5 Y; z! c3 q, c) P/ u; {$ ]% }/ |- u1 Y9 G+ S3 [2 _8 {- ]
【 NO.3 从数组中移除最大值和最小值】6 \; w2 P# S+ W$ _9 Q
1 S; Z9 E) C, A9 i: w c- Z解题思路
4 U; t9 I1 }( ?" t% ^; [贪心,按照最小的花费移除即可。详见注释。: z1 r) G6 k( s% J. a
2 c! [, l9 s' N, n7 c/ M
代码展示: T/ l# _% A6 e& M1 Z; r
& E& e/ ]( K; F
class Solution {
2 s# Y% `6 b- n5 [# G+ x public int minimumDeletions(int[] nums) {
0 n+ B: E$ ?, u1 b: G$ v if (nums.length <= 2) {: c# {7 ^- C3 J2 {( {! X9 k$ U
return nums.length;
2 i3 S( t- I% V% o' X% G6 a% ` }0 w7 N- Q* D, e) E
// 找出最大值和最小值的下标,由于 len > 2 且元素互不相同,所以最终 max 一定不等于 min3 M/ F# n3 a$ z3 O: H
int min = 0, max = 0;
) s% Z; i' i2 ]* l for (int i = 1; i < nums.length; i++) {5 V! O2 p! b( m0 d9 W( N
if (nums[i] < nums[min]) {
/ T1 H1 t7 \* ]* }" ~ min = i;
4 A7 q( b. Q; C+ [- B; j0 ] }
( c/ G, i" S# D1 x* S if (nums[i] > nums[max]) {; S, l7 H6 k( v: y
max = i;
2 b V& Q' B; ?2 L2 x }9 s% A# Q$ O$ X- c0 i7 @+ f* S! ^
}
% |8 D, A1 A0 B% [) ` // 要移除的元素下标为 max 和 min3 K' b5 W4 ^" d, h0 Q" g- [) s
// 此时我们只关心下标,谁是最大值谁是最小值不重要
# s# K# l. h( S5 h) u7 [ // 为了方便处理,令 min 为较小的下标, y7 a, m& ^% ^$ U7 O/ x# l& s
if (min > max) {& j& t7 h6 r8 v/ b
int t = min;! h' \+ x0 j* K" D% z$ Z
min = max;7 L, l' A# j8 W( P1 A7 y. f
max = t;2 l! P o9 }' Y( z; m
}
" r7 r. p& u3 p" |* z) ~4 A int res = 0;/ f; z! L4 S5 f' o. u0 x2 r
int left = 0, right = nums.length - 1;
) S3 R* W( L9 ~ v& w3 J if (min - left + 1 < right - max + 1) {
2 K [/ _& \) h( F res += min - left + 1; // 贪心,移除 min 需要更少的操作,先移除 min8 h. T6 ^" ^- O% F
left = min + 1;
- h; E, [8 ~% i+ C* r res += Math.min(max - left + 1, right - max + 1); // 然后再移除 max
& o( n- q: Q* m! W } else {$ H9 o7 @' U# n5 E- [ [9 F
res += right - max + 1;
, D" f) ?, _; V/ V7 f right = max - 1;
( m$ X, g8 M% p* m, b% I6 w res += Math.min(min - left + 1, right - min + 1);% u' }" j* A- |0 Q& M1 G
9 N" f% G+ l! q* _& X }
, A8 v; r j: j! n- k5 V6 W return res;1 c! S4 L1 q2 e1 y1 g6 l
}
/ W2 Q, j) G8 A3 x}
- `8 [- W% W: `' n$ @2 m! l+ {5 j2 q0 y9 i' t8 l" z% ^" _) T* h
【 NO.4 找出知晓秘密的所有专家】
8 S% O: H9 X2 o0 U& {& g& M0 A9 \% q% d, W& I
解题思路' _( [! [0 h* {5 V% F
并查集,详见注释。8 S$ }. O8 u5 Z/ [
$ x5 }' { |: u2 x8 q
代码展示" v- U" Q8 Z. H6 ^# X
; b) E6 ] q) S" W9 T
class Solution {* n* y, H9 V. |* A9 D% i. J
public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
" }" o% K7 n( L/ d$ y) z) f% ^ // 按照时间点将会议分组2 t4 K/ ?5 _$ ^, e: `
TreeMap<Integer, List<int[]>> orderedMeetings = new TreeMap<>();+ X' } _5 j* Q
for (var m : meetings) {2 D) P" O" J7 W, V" F
if (!orderedMeetings.containsKey(m[2])) {- N- F, E; C0 F. }$ `: I
orderedMeetings.put(m[2], new ArrayList<>());
6 w1 j2 N/ }, n2 j1 @0 V }
+ w) ]0 @; U9 K orderedMeetings.get(m[2]).add(m);
: Z& s: G/ e% g& W4 j& L: j }
, z2 i! ^! J: V8 [' j boolean[] known = new boolean[n];
0 p4 c2 K m' o9 U- N+ E, y known[0] = known[firstPerson] = true;, B4 ^; }6 \9 x4 m A1 I% n9 x
while (!orderedMeetings.isEmpty()) {' z8 ^1 j! G" X& q
// 按照时间顺序处理每一波会议
( h0 U. J& E, x var entry = orderedMeetings.pollFirstEntry();6 U0 p( H- N% O* F* J
var curMeetings = entry.getValue();: A2 m" H+ n- x
// 使用并查集维护当前时间点发生的所有会议中,有关联的人
5 ~1 K0 W/ t4 h UnionFind uf = new UnionFind(n);
! q9 Z, h. b% }( p" a0 G3 c; [ for (var m : curMeetings) {& ~- Q. q& ^: c1 v! _! L" X' `
uf.merge(m[0], m[1]);
, @2 U$ ^5 X5 r0 P }5 N3 s8 Q& I( n' J8 V; ?
// 枚举所有会议) Z# s8 c, r7 T8 X3 X/ b# d
// 若会议参加人 m[0] 或 m[1] 知晓秘密/ m' S! j" y9 p3 G
// 则把他们所在的根节点也标记为知晓秘密
8 X" w. U0 X/ A for (var m : curMeetings) {
. K! d L/ C% \, Z$ L if (known[m[0]] || known[m[1]]) {$ o; A+ c# \0 M4 t3 |! \
known[uf.find(m[0])] = true;5 [. Z7 _! s" _/ X/ ]8 a
known[uf.find(m[1])] = true;
7 ?) @8 R& }& d, i }
/ s' q$ B5 L0 `; o3 Z. r! s2 Q, \9 o }7 o" N) n4 U% \6 T; _% R
// 枚举所有的参会人,若他们所在的根节点知晓秘密,则把他们也标记为知晓秘密' ?$ L i6 ~3 G
for (var m : curMeetings) {
' w) W( L/ y/ F+ M, S. W if (known[uf.find(m[0])] || known[uf.find(m[1])]) {& r9 }; U) r. }
known[m[0]] = true;
- U* {9 _/ N( I7 | known[m[1]] = true;7 f8 ~9 J0 t/ X2 c1 x# R3 [
}5 M3 `2 J5 V$ }* q2 P
}
" j2 g- g7 Z$ c5 B* F0 n }, C4 i* ?, l! N. o
List<Integer> res = new ArrayList<>();
) g+ j8 \- u3 T) |0 l( X4 e for (int i = 0; i < n; i++) {/ U! Z! k/ A8 [7 h0 m. R
if (known[i]) {
, e O9 E) c5 C# i/ x res.add(i);
& `$ [* b0 v( d2 @ }
4 G) m+ [3 `" s0 _, E) Z3 }" ?% H' f }
6 { u0 O x/ Y8 c return res;9 N9 q, }) v+ V' n
}
3 j9 q5 O9 @% t2 O3 Q0 T4 w}) M* M' B x. Y
1 D1 j+ N3 d S7 k6 v/ H
class UnionFind {
1 r3 |" t. R2 } v6 A' h7 E2 I( o( V* v public UnionFind(int size) {
6 _8 V+ p. x" p+ Q3 o! S8 v; Q f = new int[size];
. [* p% o% U% L2 s Arrays.fill(f, -1);
7 G! u3 I1 p( r$ c9 e }1 f" z- C# K5 z& J
/ ?. F- |4 V3 m. K1 M6 ]
public int find(int x) {
& q8 q: _) E @$ z if (f[x] < 0)
/ ? p. o7 S; q8 N& m return x;
0 l, v6 g, f$ ~5 J8 e# [, g: ] return f[x] = find(f[x]);+ o4 N }3 f L2 p
}3 ]$ Y( i$ s& G o* {. E% w! c
6 r5 k( b( i* K; K
public boolean merge(int a, int b) {
2 S) n% q6 D9 ?+ J1 i int fa = find(a);3 ~# N! e& j- {7 j1 f I0 }7 T, O
int fb = find(b);
$ p1 {; M* X: j: E if (fa == fb)" [- X3 h" ^1 W* h; E6 R* a
return false;
% b; s) F0 r) j) [ f[fa] = fb;7 s: @* I0 k* E. F7 F' s I
return true;0 ~6 b/ N" k2 a4 _. R7 P5 i1 \
}' r* t8 J* v) x* w8 u
: @/ E! N1 k f6 ~ public Map<Integer, List<Integer>> sets() {! R& h# A% l* k0 a( H7 }
Map<Integer, List<Integer>> res = new HashMap<>();
3 _- m4 W$ | R2 j for (int i = 0; i < f.length; i++) {. f7 b, f7 t q0 d, n0 T- q
int fi = find(i);
2 l, |. I+ o7 C) R/ I# D9 x& p if (!res.containsKey(fi)) {# T, w6 o# ?" ]+ t( Q- u
res.put(fi, new ArrayList<>());
7 ^/ S- R& x ?5 I( Y6 L }! |: q: ?& X( r, o' T, l8 S6 d1 l
res.get(fi).add(i);
9 n" O1 r; e6 \. O0 z2 o7 s }: c f2 a i8 L7 T# M
return res;
0 J; E- m# E0 U/ n- p4 N }
3 |( q2 W% b* O+ j$ r6 Y5 j9 R, ^% l1 P5 A) h# I$ a$ e |
private int[] f;
8 j) S+ i4 C3 Z8 d2 d}+ O5 ^% | t# I' T# H" E$ Q) D. a
|