登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的所有 K 近邻下标】# @5 X+ d: P! F; I1 T
5 W/ h0 R+ V" O+ ^9 S解题思路
0 W/ q1 Q" ]/ h, v/ @遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。9 I6 o) a6 T Q A0 c
b1 r _3 m% Q" {/ [0 ^- R代码展示
2 M& j V1 z3 y$ q4 T! i+ b. |) a- b8 q
class Solution {
+ U" N7 U( q- ~/ z. C public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
9 ~6 Z9 i8 ~, A% Y# L- D3 m) G* A2 ] List<Integer> res = new ArrayList<>();: ~5 L- K4 y, m
int last = -1;; q: c: p& [. J1 N% L! ]" [6 ?
for (int i = 0; i < nums.length; i++) {
( m I, q* p& ]' l, \; Y if (nums[i] == key) {
# \2 Y, O& D) u; y# `4 e4 V for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {! g7 [0 o0 C: ^' A
res.add(j);' v8 X% k7 S) J
last = j;3 k8 Z! U3 q8 ?6 n% C
}
/ n$ l. I( ?! @) n) t* @/ t) n }: h" B/ t. ]7 t$ U/ ]
}. i8 Q9 S/ _: S" o$ Z
return res;3 x% \4 l* ~6 @6 _- G; T0 X' O
}( U2 H) l" ]" y n/ P( s
}
) X1 X& K1 \, S* \4 F j+ ]& F6 }( L& i, R4 c/ p
: d, e, k( @' C6 ?【 NO.2 统计可以提取的工件】
5 d8 }. u. d8 i4 N( r* `5 O0 @9 I! C# x% |
解题思路
0 J9 F6 N3 m. p7 }& {8 C二维前缀和的典型应用场景。 A. M- I9 N E3 x
8 ]( |% H: N8 j1 E* C& H
代码展示9 P A5 z0 Z) ?+ E L' C
% j5 e; a/ N2 P
class Solution {% U5 ]: x# h: }0 B( ~/ [
public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
1 L9 |" O" P. \# W" e int[][] map = new int[n][n];
+ j M/ O& @, }3 w for (var p : dig) {6 K# H- ]: H8 V: h; e
map[p[0]][p[1]] = 1; l* c7 [9 _8 [2 H$ Y7 d4 U
}2 R# t5 H6 H3 P5 F/ g: |& O
& d5 o* Y, b+ S
// preSum[i][j] = (0, 0) ~ (i-1, j-1) square
- C( w/ |" l; a+ p: m9 s int[][] preSum = new int[n + 1][n + 1];+ i5 m& N; K/ P8 z+ T' a
for (int i = 1; i <= n; i++) {) i. S" I; p: h: | l( ~
for (int j = 1; j <= n; j++) { |" |5 n2 M0 [
preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];+ d' F- P0 W& B4 Y
}0 s% n" t9 Z3 j2 @1 a0 E& c Z
}+ s7 c0 f; w" m( V" \
5 x7 E1 N2 Z7 S- h5 n8 b int res = 0;
' L9 m3 X# c' Z: [) x4 \# F8 C for (var p : artifacts) {
9 d* W* B* z r4 f$ x 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]];
- Z2 N5 L% t: M" k* S/ S int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);
( P* n1 P- v2 n0 p: C if (sum == real) {; b6 Q" q7 P! A, y( d: c
res++;
3 A5 N& }% k( t, ]/ J4 \4 v$ J }
; ?7 ^* c4 I; n: G- {: n( f+ S; M; d }
; i8 \9 H- H& m% s$ g1 p8 ~! K+ z1 H( b$ H! P
return res;
. t, d3 c- D0 d" L+ W% t5 t; i }9 `- W( R/ u6 z. D. E! ?# d
}2 E5 x; A1 }1 a8 n+ n/ j7 M
4 V9 B1 P2 R# ^3 v& P. Q K
) W* F6 M. Y9 q: ~8 V$ x6 ?
【 NO.3 K 次操作后最大化顶端元素】* c/ |% d' |% Q; q" A& |8 P
; v7 C- ~; [6 |9 r
解题思路+ p" N% H0 W/ u! f
枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。
- B" o% d5 _, l- t1 g$ k' O( U8 A4 ^4 A- ~. c8 J
代码展示5 [) B4 \, I3 N8 R8 @1 l0 @
6 f, V x, j4 r& S$ Y
class Solution {
- f( a- r3 O' q9 d public int maximumTop(int[] nums, int k) {% K. s4 ~& c& P6 k
int res = -1;/ n$ c9 y- m5 R) T/ w5 d8 s
for (int i = 0; i < nums.length; i++) {7 H- q( ]! g( N
if (verify(i, k, nums.length)) {+ c# G( y, F3 s
res = Math.max(res, nums[i]);
% s/ D' v) W2 a2 C$ ?8 a2 H8 i( M }
: J" G/ r' n; v7 J }" [5 c' C6 Y7 Z* a3 {" P
return res;
. ]/ m, `$ O, s5 ]5 x- n }# \% g+ {1 _3 ?( ], \
( y0 u1 ~* L9 l3 g
// 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
1 k5 H; D b6 s9 Q$ m0 G- w* J: ~ private boolean verify(int idx, int k, int length) {
8 k5 N7 v' c% y! v6 F7 W3 x if (k <= idx) {: z% M; I8 V% M& u! i
return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
4 N7 \) O/ M0 T1 a) f5 ~ }2 ]# a+ }. {; v7 J S" }$ X) R
if (length == 1) {
% c' H4 r: i; Y: n% m0 W( a return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回
- s/ O: ~% C$ y2 Y% B$ i) [ }
3 M' \% x- ~7 [: q return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 0$ K% L5 N) S( J: t
}& k; _0 I( W2 F" ~' K S
}! `6 y* {! K! R/ q$ i9 x$ F
7 X% O' X1 o1 Q& n: O7 ^( A0 z+ M- u3 F: G8 n k7 @4 X
【 NO.4 得到要求路径的最小带权子图】
/ \. w5 u+ K: ~7 A: k: [; D, x9 F2 Y9 j. o1 T
解题思路5 O5 |/ Y# f& V8 {, S/ [
求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。' g& n1 I' J* ], g
- Q5 c$ X* O+ z6 V* E. Y2 f代码展示
. W/ C; P- z* G& Y5 _4 S0 Q& Q5 C0 Y) y- J, w( _$ ]3 D
class Solution {
( @, t+ L- R7 t* O long res;1 p( Z! B" Q. B: _5 J+ y* L
- r$ l" h, e; J6 i+ C$ |2 f
public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) { o9 P6 o0 g6 f j0 }
Dijkstra dijkstra = new Dijkstra(n);
; c1 n V5 a7 c ]" ?4 i T for (int[] edge : edges) {8 O/ o. E+ R3 R( j9 w5 i# {
dijkstra.addEdge(edge[0], edge[1], edge[2]);6 T" H5 }) f/ C( ~: |3 I9 ~4 h7 D8 A
}; P+ A5 I5 N) q: x! [5 B7 G
long[] src1MinPath = dijkstra.dijkstra(src1);3 z/ u& W3 @: D
res = Long.MAX_VALUE;
# e7 E4 U% N" O% e) B( Z+ `& F" S% F" h$ L
boolean[] vis = new boolean[n];
4 ~. `+ w! P3 n* k- E6 P3 K5 G int[] path = new int[n];8 R+ b- b5 r$ X* _' }
vis[src2] = true;
0 |; u& @1 c: i! l2 h" F path[0] = src2;
$ T( F9 B5 `# K/ h dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);" K1 h0 n" |/ e- m, s: o1 Y
return res == Long.MAX_VALUE ? -1 : res;' o! }5 x% @" b! |4 |0 C# C
}
# `- M; d3 n# y" o2 [' D6 W; J7 W8 v+ i9 q# v3 K
private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
: A1 [- |9 c$ O- g' q4 U if (cur == dest) {$ k) H! g" y. p# s) p& s5 J
for (int i = 0; i < pathLen; i++) {
) @; r9 s4 U( A: c if (src1MinPath[path[i]] < Long.MAX_VALUE) {
5 i# V" y# E/ Z5 k- S7 b res = Math.min(res, len + src1MinPath[path[i]]);
. u0 M& N' T* S# s' A; T; {% ] }
5 W9 F5 R; ^( Z. S }, S. s7 [$ F v0 a. p2 G7 q
return;
. g W# `! b! O* C; n4 k" y0 ]# h }* b( i' `5 k) W9 v: i& [# x
for (var nxt : graph.get(cur)) {4 r! u* c& c+ `* w% O, C
if (vis[nxt.to]) {
6 E: P; a1 n% x5 A# N; Y3 ^ continue;
7 J& i- O5 x# N6 z1 k" E( \+ { }
/ J5 O- y2 }% N# f/ _6 e vis[nxt.to] = true;
5 M. d9 p S$ {8 C! N: [ path[pathLen] = nxt.to;6 e9 _+ R1 k) B
dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
$ y% a* L o9 U( u/ s vis[nxt.to] = false;6 w! `$ \( W' T1 _1 V0 e/ E) c" ]
}
3 X( K" f& }' ]6 T: D# G# ~ }' V7 ~& m' Q U! A2 O/ N
}
1 ^0 @8 E8 \1 B' G
& |+ X& S+ F" ^4 xclass Dijkstra {' Y8 R" x$ h* E# a' U2 U Y7 R3 I
static class Node {$ G, m% l, m4 [, w& z+ q- T- L! g
int to;
$ s& {: N! \3 _& l, S% {: Q long len; B' `( a# x0 K0 C! S6 L
2 l9 @/ t; \9 y* I5 Q- a Node(int to, long len) {
) l( y- w5 [% _; A4 Y this.to = to;
# z& k# }8 U9 O# [7 J( q3 | this.len = len;: e; c: Y# Z( [. `! ?
}( f0 O3 N1 f/ @
}2 ?1 S& |- g6 Q+ R/ R4 G
+ F8 K) Y& W& b: q& |- L0 p% p List<List<Node>> graph;
! ^7 e- j' W( }+ M4 \. b3 j5 j7 S* e) I5 [3 S! E% Z
public Dijkstra(int size) {
K" I" J0 c! p; Z graph = new ArrayList<>(size);- [- w/ S# g0 K$ ~$ k$ A- O; J
for (int i = 0; i < size; i++) {
# W& W* P* d5 T! Z! G graph.add(new ArrayList<>());- E1 y. ?( k- e5 q2 ^! M
}
0 x) w6 r3 X1 z1 A" f }: x. r: n# i1 S
3 |, [+ H( @, N. q, P# _9 A0 h P
public void addEdge(int from, int to, long len) {
; Z$ k1 B4 X: t1 E! K4 Z9 H1 ^$ g graph.get(from).add(new Node(to, len));! ]1 {. d4 a$ M7 B" ^, C" T1 \
}
9 u4 u4 Q( f. e4 H2 R% H; E2 N7 E( ~, k" M' U! v$ I; r _
public long[] dijkstra(int start) {6 j* d1 z5 {: l, l. V
long[] res = new long[graph.size()];0 V+ @5 [& p5 t6 c) y f1 R
Arrays.fill(res, Long.MAX_VALUE);
w. D2 G H* y7 x; T res[start] = 0;
1 J2 y" o" V7 I. M9 g1 U& q PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
3 W Q2 x0 Q- E+ D heap.add(new Node(start, 0));/ {1 x5 u( z% X C
boolean[] visited = new boolean[graph.size()];
4 l' x0 Q! v* i% K) }3 W; w% X while (!heap.isEmpty()) {
$ m; a3 r% p3 w$ q Node node = heap.poll();
- L8 |: p: a0 A; Y if (visited[node.to]) {5 U# }+ H) Q8 z* E# c! t( W
continue;
; [. F& M, \$ j+ G" D }: a+ {3 O" ?0 v# G5 b
visited[node.to] = true;) K" ~ g8 {. h7 J
for (Node next : graph.get(node.to)) {
) V/ f' |- I, {9 \3 B' E, ~ if (res[next.to] > node.len + next.len) {
% g- y! d+ H7 {; `. H* Z: M res[next.to] = node.len + next.len;
- N8 U$ S" l" u# F9 [ heap.add(new Node(next.to, node.len + next.len));
% N% K V V% |+ u+ x: w7 i: b }- l( c# p! a* C
}9 D. R" t$ }/ s3 D \; Q
}. @) ?2 p) t6 h1 Q/ e/ a. Q
return res;% J) v; ~; @5 }: w- R
}
' b; ]* f2 p0 K0 c0 b A} |