登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组排序后的目标下标】
8 x4 q. X. |4 T; H, t; U7 [解题思路
5 O& g5 t7 J+ X2 d# p签到题,循环判断即可。
% Y; U: ?5 I' K( b, J0 I
- x# n2 [0 I& C3 ~$ _' `代码展示
$ i1 a6 Y3 Q j$ }' [6 p: l8 {* h. e9 N B+ Q3 Y
class Solution {9 e* Q% b, I; } b
public List<Integer> targetIndices(int[] nums, int target) {6 I3 F) B4 J" n! r. a" m' M
Arrays.sort(nums);
1 Y. s+ ~& T2 L& U& l5 l8 l List<Integer> res = new ArrayList<>();& [0 Z0 O7 _/ A
for (int i = 0; i < nums.length; i++) {+ ]9 @: g' w/ ?0 n. E
if (nums[i] == target) {( _0 O" B J4 `! T$ R
res.add(i);
! s9 t- m' g7 L6 a& n+ | }, }, P8 J% Z9 l4 e5 ~: X/ C
}' n9 G* v' P0 V' `
return res;
+ E' n/ M+ G" o4 M }
# d2 I# \8 n& [1 g8 Y# ]}
" y; J6 a8 q/ {, d+ O: C) R
& J3 _1 j- G- P. C- F- k' ~; }【 NO.2 半径为 k 的子数组平均值】
; v5 K+ J- t# G, ~解题思路
8 j5 X1 z7 c0 @; X5 a: o使用前缀和计算区间和。注意使用 long 类型以避免溢出。
- G3 _; `5 a5 {! r+ n) o$ B+ H6 B3 W: M5 Y% G& s
代码展示
# {6 T- K% o- n% ]6 I
8 O& Y& `$ C Vclass Solution {
0 e+ {$ R6 i1 e- x8 K4 x% v4 T; ? public int[] getAverages(int[] nums, int k) {9 r' g/ W1 M& b) W* t0 F# S$ l P
if (k == 0) {
8 ?, Q* @' H) H. k5 i8 \ return nums;" V" k; k1 K- b) w3 ^* k
}
& D/ H) }" m( W' y long[] preSum = new long[nums.length];5 J5 s" J5 }! G0 L5 c
preSum[0] = nums[0];" j$ T* Y8 x' F. i% u* T* V
for (int i = 1; i < nums.length; i++) {
6 V, Y& r* G$ \# O4 p# J' g" Q preSum[i] = preSum[i - 1] + nums[i];! g+ S. z: J4 u, B5 i
}
" K7 O6 H* G. L3 _* k int[] res = new int[nums.length];
( v Q+ Q. t: Q" ~& c% x/ n Arrays.fill(res, -1);
9 W% k0 c9 ?% I, _% u, v- @6 z/ x for (int i = k; i + k < nums.length; i++) {
# J: d: J( C2 N8 z i long sum = 0;
& O* T7 w$ o/ f& w9 } if (i - k == 0) {' X: v' l. [% f
sum = preSum[i + k];$ U M& D# N+ y6 a
} else {# P1 E8 j! z. e' d# d: V" m6 _
sum = preSum[i + k] - preSum[i - k - 1];
. j: V- Z3 X) ?7 r) m' f7 e }
3 p6 b6 t% r. u ]9 m4 T res[i] = (int) (sum / (long) (k * 2 + 1));
2 j5 k9 V) v. n1 g( o9 k0 ? }
! X& j1 T g$ x return res;1 O% E: i" o5 |+ r
}2 N, I3 a: {7 U
}3 \; f7 _ G" P7 P: V
/ D. P$ }* `# C% b( ]) k0 }: P7 \【 NO.3 从数组中移除最大值和最小值】
# l' e5 F, S s, ?) y* c* \$ L
/ `. a& L5 f! u& T解题思路
" q* W% \/ H5 t! M+ L: z贪心,按照最小的花费移除即可。详见注释。
q4 Z, O, O3 s- ]) K$ L, J( a3 C8 i
代码展示
" `% b* w5 s- x& }, g" x5 n
1 r" _) n: ]9 V! Nclass Solution {# n' P. o! E' q; u# f, X5 V; i
public int minimumDeletions(int[] nums) {4 M( M9 T3 X! w' R* S
if (nums.length <= 2) {
# U' w) s4 E% [: E return nums.length;+ g( x3 w" D7 }; j, A
}. S, \& i$ @+ C/ ^) r; w
// 找出最大值和最小值的下标,由于 len > 2 且元素互不相同,所以最终 max 一定不等于 min0 k0 A- ^/ q$ o1 c; {
int min = 0, max = 0;6 X' c- m1 b3 {; q# N% Y
for (int i = 1; i < nums.length; i++) {
& u7 o4 u+ U- x3 }. u- }! g5 X if (nums[i] < nums[min]) {
' B8 ?1 I' t; J& i# g( w min = i;
% y# Y+ b. v% |5 @ }
0 v5 m9 n" D5 r- g7 T if (nums[i] > nums[max]) {
|* j) h1 j" R3 Q max = i;, K2 @: |3 \, Z& _- s
}
$ ^. v! Z5 _! b4 X. J }. [: s( n" P. q) B
// 要移除的元素下标为 max 和 min$ O' S( R5 o' e0 t
// 此时我们只关心下标,谁是最大值谁是最小值不重要
/ z! A9 x9 X& R9 L' r+ ?" [ // 为了方便处理,令 min 为较小的下标9 x3 P! E. w9 F& n& E4 d
if (min > max) {6 s3 J% `- h% M7 d& W
int t = min;
- I$ |; L5 z$ |0 s' r5 a0 m* m min = max;" i2 E2 n# S2 x Y
max = t;
) r' D( e& d- y8 N* s7 [! s }5 i: x( d- L' ]3 K4 H8 q- J5 f
int res = 0;
5 y. Z, i1 e9 E# f( R* e int left = 0, right = nums.length - 1;: D& P, U9 S5 V# G4 q) k. S
if (min - left + 1 < right - max + 1) {7 t) v8 d+ x' Z0 n
res += min - left + 1; // 贪心,移除 min 需要更少的操作,先移除 min
' n/ S6 {2 C! h% N) b left = min + 1;/ h7 {* A4 n( ? R; _. u3 }
res += Math.min(max - left + 1, right - max + 1); // 然后再移除 max
7 C3 T6 b) _3 r } else {" `" X4 Y& k: z( B5 x* ?
res += right - max + 1;: o; q# A# L' c+ }# n
right = max - 1;
1 O& @0 l: W, v1 f res += Math.min(min - left + 1, right - min + 1);4 g) L# ]: D3 p( T0 c9 J7 R
. C1 _8 M+ N ]! D0 A( o) I2 M7 C' v }4 Z/ q$ k. P; t* h! K
return res;
' @2 J- l" {; H! g }
0 }* c1 x2 z, V: a}
! C8 n" z9 y. D4 ^8 w! g, V! n! u$ h
【 NO.4 找出知晓秘密的所有专家】
3 [; \8 @! v6 |( y6 b# X4 q, I7 U" r t
解题思路
5 ?6 t( T6 Q/ ]9 S& @8 y并查集,详见注释。1 B# z/ g1 u0 K$ v1 h. p
# E+ `( d4 u( @. K+ [代码展示
% w8 C$ [* K: x+ z
7 {* X% i1 x" D5 p& p( c. W [class Solution {* Q9 Z+ _& D. x. n
public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
: x5 U& l! x. F // 按照时间点将会议分组
; J: \) F& T. G2 ] TreeMap<Integer, List<int[]>> orderedMeetings = new TreeMap<>();/ Z7 g& {/ \+ Q) q
for (var m : meetings) {
) t2 p: s* R( M! i: C if (!orderedMeetings.containsKey(m[2])) {
8 _3 o( b: }( f% @ O6 P orderedMeetings.put(m[2], new ArrayList<>());
4 P J' m! ^* Y. D8 u }' X3 `4 j- G/ [ r' [9 q* m/ p/ u
orderedMeetings.get(m[2]).add(m);) v) H5 t5 ?# V
}0 W: a* V P0 H$ }1 e
boolean[] known = new boolean[n];
" [: {: S( u# U9 R Q* m. @ known[0] = known[firstPerson] = true;" I1 s0 g# l6 l9 l
while (!orderedMeetings.isEmpty()) {
& N" }4 J1 n# R6 T5 @ // 按照时间顺序处理每一波会议
( e+ e: w3 ]1 i var entry = orderedMeetings.pollFirstEntry();+ R D7 j. z" a+ R5 l. D( N# U
var curMeetings = entry.getValue();
. S, }, J$ a" m6 G% f+ W4 O% I u // 使用并查集维护当前时间点发生的所有会议中,有关联的人
0 i d' `/ i; t% `9 w UnionFind uf = new UnionFind(n);) x8 [+ P7 Y. x
for (var m : curMeetings) {, m/ i3 j6 B/ i5 E) E
uf.merge(m[0], m[1]);
! L: f* A2 R! u }! C& l4 j$ O! @/ Q3 g
// 枚举所有会议% a, S& Y( F- d; g" X+ \
// 若会议参加人 m[0] 或 m[1] 知晓秘密
, V8 ~) c& M/ u // 则把他们所在的根节点也标记为知晓秘密
$ e# P( S2 P$ q& E* Z for (var m : curMeetings) {6 U' b( |5 q2 |' N
if (known[m[0]] || known[m[1]]) {
& x- x! k6 Q' ^: Q0 V known[uf.find(m[0])] = true;
" N$ [9 t; P o known[uf.find(m[1])] = true;
: N/ d; m$ P ~: F }9 s. |. |$ Y8 R2 P4 h4 ]0 I# w: @
}
$ n& e8 Q- {/ k- M' J2 K0 S // 枚举所有的参会人,若他们所在的根节点知晓秘密,则把他们也标记为知晓秘密, r" q0 Y% M8 y3 H9 m- p: M
for (var m : curMeetings) {
4 ]- y/ \, E" o$ Q Y if (known[uf.find(m[0])] || known[uf.find(m[1])]) {
! j3 A0 m7 K9 p) d0 Z known[m[0]] = true;
+ M7 Q7 t/ i" d; A known[m[1]] = true;
0 b2 e5 l8 l1 S }
& X3 R9 p U% i6 T }
0 _ ^: y. t: A3 A8 \ }( h, l" T4 d: S2 m4 S
List<Integer> res = new ArrayList<>();
/ ^3 S) h9 t } p: M6 H3 T for (int i = 0; i < n; i++) {
$ l6 I. f7 p0 B% ~+ \- U, T; O if (known[i]) {
. x5 z! J: n0 C' g& | res.add(i);
. y6 W/ v5 g: N, c }/ Y* L+ B9 \ l' l; u5 l% d7 E
}# N( z# @% h5 Q" w& u/ H0 ~) \
return res;
* G. r9 P9 z; d: O. I1 Q }4 {$ V# x j8 P
}
' s$ \6 K2 j! V- m; o
/ x! y+ y9 S5 x0 y* Y& ~* Jclass UnionFind {6 J3 S9 V, r2 y/ B. Z9 u: C
public UnionFind(int size) {
. ~1 u" k7 t3 z$ a% q f = new int[size];3 U, R" O' _. [5 G3 {* K
Arrays.fill(f, -1);4 u! \/ j, j& K8 J8 j* R
}3 a4 C, h% w- p A
1 R i" d+ U) N$ Y) g public int find(int x) {" L' b4 m9 }5 E& M
if (f[x] < 0)# w5 }2 J. y8 L* M1 s
return x;+ g2 z* M! u. h6 Z& x1 B
return f[x] = find(f[x]);* v5 e- a4 h0 h
}! T- N8 [+ g/ e( f/ w1 {( V
- g* y5 s' L6 n L( z; v public boolean merge(int a, int b) {1 P! V7 ?' b. L$ A' D
int fa = find(a);
" {+ n9 X, e6 U8 s int fb = find(b);
" ~; G; C. ?3 p0 O" t6 z if (fa == fb)
9 h3 G- d+ r* R1 |! P% g return false;
3 G" Q( W( A7 f3 Q/ u5 b6 z f[fa] = fb;) B' v) k0 M& o+ h* O3 r3 S9 R0 b, ^
return true;: Z8 N. p! l4 p" b. W2 g& @: G
}# s: I' W: F8 |
g' ~! d& L2 n+ W public Map<Integer, List<Integer>> sets() {; z- F: E: O) m |9 r, t
Map<Integer, List<Integer>> res = new HashMap<>();) r- ?1 ^- ~* r$ T+ |9 l; Y
for (int i = 0; i < f.length; i++) {
8 x7 h* l2 C; c' \6 z: {% \( Z int fi = find(i);. R8 @. [2 }* c4 a# m
if (!res.containsKey(fi)) {; l* c' a: l4 |3 j/ T5 p
res.put(fi, new ArrayList<>());' a5 c% I* C6 w2 d8 c, B
} L% W( x; ~) _' j. {% U
res.get(fi).add(i);0 q+ h* l6 S: x, d' Y S+ c
}* H j1 }3 d$ ?2 N
return res;
, }1 }1 w6 u: S. V4 a, Y2 J* h% Z& O3 s }
- J. P; k+ p( B3 J
3 Z5 c5 H: G; ]& ^) [. c private int[] f;4 }: H [" B2 t2 X" p& T9 M
}
( y& U3 a' e- g" C+ x3 M |