登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的所有 K 近邻下标】+ V9 O1 r; Q' t; j5 P# ]8 F4 @
( y! I" i+ z( W
解题思路
0 R7 g1 h+ f, ?1 H C( E3 l遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。
8 ~5 a$ j5 ]+ H4 O0 S; |. e1 e8 r& o$ Z* p
代码展示6 U' S3 t3 m1 p4 U
, {" w4 F$ q4 K8 b: q" P1 z1 q4 e
class Solution {5 c7 D: S" y f$ Y' x( ]
public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
) z5 X( m n. k( I List<Integer> res = new ArrayList<>();4 q% Z' g+ {1 a: w- I+ T5 ?
int last = -1;$ E9 [7 }$ M9 i) q1 j
for (int i = 0; i < nums.length; i++) {: c! U0 o: M& i) b; z5 N
if (nums[i] == key) {0 v2 p% e7 z2 D2 t- R* G
for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {% l2 Q, U1 O( A, d
res.add(j);2 @: ]4 K a; G) ^* d( l2 }$ H/ `
last = j;
7 D6 a2 q5 J7 W4 D2 G, E }
1 y) t- W: j' x1 t! S- u F }
, M9 G8 ^+ }! x }
1 o% y9 U# B- h+ ^% l E return res;
6 r+ t' z. g7 o } d& ]. W! i% c& z$ L
}, U2 l5 H9 E6 I: f
: ]: c: M+ d- i0 b' H V$ o" _$ S$ V% p, r9 k$ z9 ?
【 NO.2 统计可以提取的工件】) H: z' ~7 h! r1 x% k& x
. a+ W [7 Q5 F1 a4 U
解题思路
! V& E6 _) X* W+ {+ Y二维前缀和的典型应用场景。$ n( m( C- {# b* D; q, C
: e; ~; [+ r8 j) k5 n+ v代码展示3 b0 W7 n, p/ ~. N& R. X
0 x' s2 |: d! ~( O$ M! hclass Solution {* v+ S* r) A7 O2 \
public int digArtifacts(int n, int[][] artifacts, int[][] dig) {* p* a. L7 B" O- ]; N! S) t
int[][] map = new int[n][n];, r* D& b+ x T$ t. m9 a
for (var p : dig) {
- A3 U+ ^2 y8 A) ~* } map[p[0]][p[1]] = 1;
" A* ]% i: G" l: d, ] }/ ^" o$ r) X# w& T+ w6 z
/ L' @% R* T m // preSum[i][j] = (0, 0) ~ (i-1, j-1) square4 ]' @2 L. g: I
int[][] preSum = new int[n + 1][n + 1];
; r2 ]9 a& H; @: n1 _% f for (int i = 1; i <= n; i++) {
. o% T1 v; \, I" {* X5 @ for (int j = 1; j <= n; j++) {4 L- i4 i0 B! B/ x8 }$ y
preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
( O8 |- ?0 c9 h! l- V" k( { }) h- h1 n h" C/ E/ b
}
7 Q6 D1 n' a1 Z- d) Q' _9 ^
% ]7 Z# m$ D( F. z( y int res = 0;; y7 c/ ^( F) ]% c% R0 q O) u
for (var p : artifacts) {
* f/ _9 k( b3 T s6 l, f% m int sum = preSum[p[2] + 1][p[3] + 1] - preSum[p[2] + 1][p[1]] - preSum[p[0]][p[3] + 1] + preSum[p[0]][p[1]];( p8 k. i. q% ^4 F3 P _
int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);
; V: x. c8 a5 ?. t8 P9 K4 m if (sum == real) {+ m1 |" o& f, m$ }3 h& n* m
res++;
1 z# i" h1 g1 P& K }
" n6 D$ x e! C3 | }0 @3 E4 ~: E% {+ u3 Q
6 ?+ H' p F; r: R$ D1 y/ d" E( Q return res;; h) f, @& }) u0 |
}
1 P8 B) ? V7 r& b/ o$ I}$ D- q/ S. g+ v1 R( B/ y" l
/ B- a* k$ m0 C$ K! t2 |8 h) _5 S( u% D$ S9 S0 j5 {
【 NO.3 K 次操作后最大化顶端元素】
+ m+ F. h4 j9 L( v
7 X; O2 w& a+ j; R* W" h: A9 Q解题思路
' ~8 P1 ?' k3 j6 b$ D: a3 i: Y枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。3 [1 R8 w2 U4 r5 V
/ z% y0 ]; g5 Z) @- k; U9 F2 y代码展示
6 A4 c5 t" W% `4 M. M
# X: p' ?% G1 ?& C( F, m5 m0 cclass Solution {
1 q8 a+ H" E. o; t public int maximumTop(int[] nums, int k) {3 H, D2 m9 C. v# D. x$ z8 J$ k# c- N
int res = -1;
* A }# F. y) B5 ~ for (int i = 0; i < nums.length; i++) {' ~9 W) b) W1 D& v$ S( T+ M! t
if (verify(i, k, nums.length)) {
" Q' K4 t( @# g9 q; \2 C8 _' }" `' { res = Math.max(res, nums[i]);
% S! g5 u y1 F, w3 Y5 Q# W }
/ R& h. {- u+ k& ^# M* C, l }
, @/ M( @! ^+ f return res;* b% D5 ~) v% S1 K$ O- q
}8 E7 M. C* P6 _" M) K
: C: M H' u6 `0 Q7 `( R' x
// 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
; i% v% B, b1 R private boolean verify(int idx, int k, int length) {. S% f* }. o* y6 r* b4 B @
if (k <= idx) {0 ]% V" Y( f, k5 V4 ]: K
return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
4 u; v5 j0 B2 ^2 j2 ^+ M; U. o }
" L& A7 Z; k7 D, x% I/ Y6 c if (length == 1) {! k3 i* z& m T: [& K
return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回
6 I! E! h' R% p }/ o! P+ M+ t% M; w
return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 07 j% y! `/ Q. P+ m- Q
}4 O, l! u t8 O* T- D
}9 u- F5 l7 i o8 j. d# U3 w
/ g v/ k# M1 J; v+ I+ \. s" G5 @" E" B; D0 g
【 NO.4 得到要求路径的最小带权子图】) d) @8 p" U- `' f) M( W
# l! l' `! h0 N/ I
解题思路
" M8 T. w2 j6 X, f求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。
3 Y) x0 Y1 z6 V: r( i& Z4 T; ~+ d5 j" J0 |4 c
代码展示( z! |" g9 L0 O% S$ a& A% z7 A
9 W3 @: k' i B" y" O
class Solution {
/ ?: y& E9 A& x# t/ I3 P long res;7 _) ~* p5 B" a" p, ^! V" n
2 O$ e2 Y6 z& r2 i L; ~* o7 I. g% @, b7 f
public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {
6 `: J. v6 t2 C4 `3 F: U Dijkstra dijkstra = new Dijkstra(n);+ w4 g7 R/ W" S$ ?- F! g
for (int[] edge : edges) {0 N9 ~; T' R0 D( @
dijkstra.addEdge(edge[0], edge[1], edge[2]);
5 S. n( d' f8 b1 e& ?" N. I }
0 v( k5 l: u9 i7 `) @' J2 Y long[] src1MinPath = dijkstra.dijkstra(src1);5 Z4 ]; x% s6 b4 o8 r/ {( k
res = Long.MAX_VALUE;
* l8 G( V/ j. u: [
9 v+ J5 [* C& E- c/ H$ Q& B boolean[] vis = new boolean[n];
' ]( |0 V! G0 s4 P- ^$ a. Z int[] path = new int[n];# C4 w* u/ O* W! U
vis[src2] = true;
& D+ A! R4 v9 @; e+ K# o H path[0] = src2;
* Q/ C) |) q0 h+ U. _( K! d dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);7 E& ~, i- `4 b+ ]
return res == Long.MAX_VALUE ? -1 : res;6 x- @: z6 n: Z) V* j
}
9 ^5 j H# F# e$ C" U( j* ~& |
4 m+ M1 p$ f- A$ n private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {% P- U" x4 }: t3 P {5 [
if (cur == dest) {- Z- s& Z# \: n7 u" L# z- M
for (int i = 0; i < pathLen; i++) {
/ M$ S9 S$ Y0 R' Z- u# C9 W/ y if (src1MinPath[path[i]] < Long.MAX_VALUE) {
7 S" _7 X6 \, B! w res = Math.min(res, len + src1MinPath[path[i]]);
/ N# Q7 [. a; c6 y) o7 k. x* ~1 E4 g }
/ H) d' \$ T5 J: t+ h3 N3 g }) t: {3 g9 |/ s1 @2 O v
return;
) G( H; K0 q- y2 U& l }, \- Y2 I7 P7 B3 G. j
for (var nxt : graph.get(cur)) {) X& X# j4 O) Q6 b" ~. E
if (vis[nxt.to]) {
" e( E! c" i; M" I+ ?, ~+ }5 Q continue;' Q- l, q/ I. p3 r! [0 Y
}
8 {& t5 r5 k" Y- ^ vis[nxt.to] = true;) j& N1 S0 W. y, l
path[pathLen] = nxt.to;* F& {( i m( u0 l2 Z; s6 h/ ]: C
dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);; P$ h% j, O/ _
vis[nxt.to] = false;: K* k+ \. U& j4 M |, v9 q
}
; X- T8 b2 y2 r/ j. g- J" J- n }7 ^$ ]: Z# x1 x9 W/ [
}! p& {0 C; g4 F
' M) ^- H: U6 c. uclass Dijkstra {6 h9 g a5 ?' A/ ~
static class Node {' h0 N K/ P" D& U
int to;
. z- F: m- m" V7 y( j long len;) i U- l, p/ n# Z3 q; f
r) K: `+ N D% [3 B
Node(int to, long len) {5 C: H) ~6 J: d1 A& A+ T+ p" c
this.to = to;' ^) G) I* ~# L1 y- B8 H
this.len = len;
3 Z7 t. q! ~; ?' x. U }3 z7 T* b$ e% t
}+ A1 B* }* g# H- h' T
1 ~& U8 G7 ?& M& o! [0 n% L8 _* ~6 J List<List<Node>> graph;
7 M) X) r' U, n5 J& |: x6 g1 S/ a: G9 T, w# \5 e8 v
public Dijkstra(int size) {, R: C5 ]6 v) r- C, V
graph = new ArrayList<>(size);0 A* U M6 g* a1 q
for (int i = 0; i < size; i++) {* r" j7 |7 E s( V$ X' ?
graph.add(new ArrayList<>());
; z" F: |3 S" S X5 n }
- o# [1 x) r. J. J9 a( ^ }
+ B( w/ R, N) E- V1 G1 n" P H( C; W. B0 }$ u [( `6 m
public void addEdge(int from, int to, long len) {" C9 i7 U+ _) s |! `: K8 {
graph.get(from).add(new Node(to, len));
0 }' V& p" a) ]! |9 d# a1 h- w4 s }2 R. ^9 r4 }" R' F! D6 B3 e2 o% h
$ A+ r5 ?" J4 d5 {- j
public long[] dijkstra(int start) {
+ |7 u/ M, w# p' N7 t+ r long[] res = new long[graph.size()];
e9 T8 g" z% E1 d. |+ ?, l Arrays.fill(res, Long.MAX_VALUE); M9 |+ ], G$ Z9 D7 u
res[start] = 0;
* B: R! a2 F+ j3 Q; w" G. `' e PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
2 G% a v- c' ?0 N& L& M heap.add(new Node(start, 0));
/ \0 x7 v; S8 t6 b7 V! m boolean[] visited = new boolean[graph.size()];+ P2 v! y$ t9 g; `" x; h3 V! X
while (!heap.isEmpty()) {
3 Z8 \- l7 f1 }4 i0 i9 ~0 Y) d Node node = heap.poll();
9 @: e6 b8 k5 {+ u if (visited[node.to]) {1 ?5 o# |" [2 z* ~* s+ O
continue;
2 ~$ e; @8 p1 ?: b9 [3 f }
3 ?. f- N! c3 ^3 x7 h visited[node.to] = true;
* Q! X a/ f7 E& j m' F" l& S for (Node next : graph.get(node.to)) {! p% F, y+ W4 K& K0 S% N( `' {
if (res[next.to] > node.len + next.len) {8 R' b3 g9 ^; Z+ t7 o1 X
res[next.to] = node.len + next.len;/ M' V; ?* x) p9 L- J, Y& V* m
heap.add(new Node(next.to, node.len + next.len));
: I( E9 L8 P6 ]7 k9 D }% F! h" }6 U& k/ \& d9 q# J- z
}7 K8 ^! D1 D7 O
}6 }4 d4 |6 W! X6 {+ V9 h
return res;/ @# C! ]( F" ]( {: d* h
}+ [) P2 D1 T9 C3 Y) c9 `" i" x) |
} |