登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的所有 K 近邻下标】
3 U4 ^' o/ y( w: g
; g- p3 S5 w- a- ` f解题思路6 [. O. u* c3 C# U4 q: G
遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。; _: ]9 i. v- W) B$ c: p M5 L) v) S
- m+ ` Q2 A, g. E/ g; V
代码展示/ A0 C7 L1 |1 _& L, Z
' U3 @0 h) E) H9 b& Q t8 R
class Solution {6 n! ~6 n% j- C4 p- D: }* Z
public List<Integer> findKDistantIndices(int[] nums, int key, int k) {- v, O* h4 Q! A0 J% Z( N
List<Integer> res = new ArrayList<>();. [, [8 S% W% q2 h
int last = -1;
1 A" y; P S) q N+ K for (int i = 0; i < nums.length; i++) {: f7 S7 h* S( @9 i) j5 H, |
if (nums[i] == key) {
6 B0 s( [4 w) ^ [ for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {
' k1 L# E# M4 Z1 ` res.add(j);9 u' o0 J0 a; L( f, V# v
last = j;' M" u2 ]5 j( A+ ^+ x
}2 ^1 p; u1 l$ D1 U+ @: q3 g. A
}
' _# M9 @0 p4 J' v) @5 p( q2 O } } m8 q1 R& W' t1 G0 ?
return res;2 U7 i7 Z+ q& s, @, o
}
+ }' m$ r o+ _1 N- M7 P. o2 r}
% b9 E9 m3 R' f; u; t9 n8 R" {6 q q5 A7 q& c4 b
- G/ T) @$ B) W; j3 i1 v. Z
【 NO.2 统计可以提取的工件】
0 H- F/ x# `: u. A% I# P/ S3 O, ~ _/ Y$ N
解题思路
3 Q; T" w" A9 n; y; U1 S二维前缀和的典型应用场景。3 H' Y5 n/ g W; S* {- y. w
, j& B5 u" j, @& A代码展示
# P @3 d0 c/ X3 d6 P9 X6 M5 c$ L* Y- `% w
class Solution {/ W& ^5 ]2 \. a# B
public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
0 ?4 o7 W( M, |3 y/ E6 m- j int[][] map = new int[n][n];0 x6 Z2 L+ ^2 S; d7 X! k0 A
for (var p : dig) {1 N5 ? F$ k' o% Z3 b2 Y
map[p[0]][p[1]] = 1;
9 r- |% E8 G/ b. R9 P5 X }- B9 t7 B; L% Y6 O: d+ H: ~
1 _+ x D% U+ }! E // preSum[i][j] = (0, 0) ~ (i-1, j-1) square: T6 p6 F- {: _9 ^* I
int[][] preSum = new int[n + 1][n + 1];
2 A# V* l% ]+ W5 I/ j8 L+ _( O* T for (int i = 1; i <= n; i++) {9 U/ z( V0 }0 A+ p9 A
for (int j = 1; j <= n; j++) {: y. E0 [: V% G. d
preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
% z! W% q* y: @/ b }5 S. [, y3 b; u
}
0 ?, V1 a r: l! D: e
l3 U3 S: w3 Z6 f. {( Z/ d int res = 0;
9 x) A- y8 \4 v+ S6 @; ^) {+ s- h for (var p : artifacts) {
+ J4 p6 {" e$ }: b, ~8 O. L 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]];
0 V; u: ], W% r, B" S0 O) x int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);$ {$ ~2 X; L: q5 @! Q7 E6 ~# S
if (sum == real) {
$ W9 p& N9 x; Y3 Y! H, }- a res++;
7 |- M" u/ I7 }( z7 S; H# m- M; | }7 X) c; C& c( o( H( w L/ l
}- O5 [5 Q: B! ?) X+ I' h% k* u
$ H9 m* Z% E7 P4 R* \; X* W return res;
' x* _' K/ R' O6 `9 y }
: q9 L1 x$ y+ u, S: _}& y- ^: S3 `( V
" b# |3 P' }: |. o; Y$ C- j) k! Z& O
9 [5 _0 A) r1 H7 }# H I D& z5 z
【 NO.3 K 次操作后最大化顶端元素】 J& ]4 l! L( e, H/ }6 n5 ~
8 j8 d+ q! G4 y9 ?; f$ }8 y) T解题思路4 E5 h% a# J# u1 N% T7 U. o
枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。
9 Q, O' c6 k& Z% |9 L7 X
( X6 U7 U3 \2 q0 T1 c8 }; }/ j* }+ E代码展示
0 H) A9 M9 f# R4 T- U3 C, n
5 ~. k# j. j. Y8 e/ Cclass Solution {* ^, s$ }" Q: m! u& k) h
public int maximumTop(int[] nums, int k) {
8 b8 @' }/ n, x. K2 U o int res = -1;
( l+ C" g ~" w for (int i = 0; i < nums.length; i++) {" N/ \9 ]2 T+ P( x# M. q; Y
if (verify(i, k, nums.length)) {
& g( K! z t* c: A4 p ?% ?2 r res = Math.max(res, nums[i]);
, J8 j$ _: ~ \ S8 [0 h: j t }
- p& D' P. d5 \: W, s/ O# a6 d0 g; } }
) W* s9 T8 b8 z# d! G; e) \: x return res;, \* z8 \: Q6 v* t& S' q: l
}
; r% m4 g4 }) x/ g' A! L
% b# V" J2 @ b( o( m // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶. L5 p7 Z. S* q$ \9 o( ?
private boolean verify(int idx, int k, int length) {7 G& I& x% F0 ?- o) h5 S3 ~
if (k <= idx) {+ h% N+ R7 y, ]# ^0 N
return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。- ?- a# [5 A6 b3 }; ~
}" l& h, T8 _' h7 G
if (length == 1) {
$ B( M; L0 e) L, r return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回
3 h5 W/ D! y- V; V# v) ]" S W: m }
! e6 V: M4 [$ R return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 0* @8 G o3 @7 F0 k8 {/ i! ?
}
2 t }$ a9 x6 ?3 Q7 \7 ^$ \$ Q}
8 g: Z0 c# J' W6 W& b
; \& b! Y3 J; y Y& N7 a
% q' U' q# Q- f' D【 NO.4 得到要求路径的最小带权子图】, L. W; W8 I% s( s7 f
- k: S+ p8 a" u3 L+ |
解题思路
' z4 z3 t3 T, @0 r# M求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。9 l1 h9 z1 b6 U- o5 o
4 C0 L4 Y3 G" _0 z# v# X代码展示
]$ J/ _& i: P9 }7 D2 A8 W
! X% T) @4 ]6 j; I) L# ]8 rclass Solution {. m$ b. H# I- f4 R% t
long res;7 c6 x! J4 d0 J) _2 n, R: f3 o. q
+ m1 `1 z+ }* F# ?5 K) r. j public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {- U! ~ |+ N: A; ?
Dijkstra dijkstra = new Dijkstra(n);
3 ?+ X& C3 |- T' H. C for (int[] edge : edges) {
! D' J5 m+ ~4 N dijkstra.addEdge(edge[0], edge[1], edge[2]);6 A& v$ |: t6 Q4 _$ \
}: Z' \; z3 D( q3 p1 Q- b
long[] src1MinPath = dijkstra.dijkstra(src1);% I" J2 p* H3 s ~2 n( V2 m
res = Long.MAX_VALUE;, Z- m9 @2 I. c0 C# Y k
9 P. Q8 N$ [4 x% a; B/ ?$ N! F3 ] boolean[] vis = new boolean[n];
# J {: }, `, I int[] path = new int[n];
8 [7 S- l J$ k9 Q% f% L$ g vis[src2] = true;. E- S5 m: S( P# F
path[0] = src2;1 D4 h# {, G0 h% W% ^7 O6 F
dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);
) z0 X7 c' U! B return res == Long.MAX_VALUE ? -1 : res;) L6 Z* r0 L) u1 S
}$ w+ V9 q# m1 E, N5 u# i
- r1 o; ?! K) H/ ?' `0 H% J3 P5 a private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
$ Y6 Z w0 c5 V" B! Y/ E if (cur == dest) {
' _7 _0 R$ c! G9 ~4 { for (int i = 0; i < pathLen; i++) {
3 z* a' Y( P% I* a7 X+ w if (src1MinPath[path[i]] < Long.MAX_VALUE) {
! E; T8 v7 l3 p" M. ] res = Math.min(res, len + src1MinPath[path[i]]);
. N' d& ^1 M3 z# }3 z }
' J$ M. G# i* V }
, L$ _4 z5 J2 g- P return;9 \% K0 A% d# @$ T D& B' N
}
. g' \4 Q* c& a* [8 M1 J for (var nxt : graph.get(cur)) {
- u; n5 X2 t* I) d) P4 a+ ~ if (vis[nxt.to]) {1 I ^( V7 y# `3 ]9 ^. S) u$ t; A7 |5 A
continue;
8 C5 q+ ~) k: D6 ?& t+ m }
0 m: F( q9 G& j2 R& U6 N vis[nxt.to] = true;/ f0 v. ?9 Z [. {
path[pathLen] = nxt.to;
, [9 E; B2 m r M, P2 G+ Z* g dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
6 ^5 z5 L/ q. X) A0 X! B' r vis[nxt.to] = false;8 a4 j6 _+ `. K" x& g$ ^+ D3 Y
}8 Y5 q$ X% G$ F g3 n8 A" M; i: x6 o
}
! U/ b% u2 g7 J- k2 v2 X7 j2 z}
% C/ r; h7 Z' F# _8 U8 S; G& ?/ B, z% j0 a6 w
class Dijkstra {
/ ?0 J* @. y2 k2 Y8 k5 S static class Node {
6 U# G/ k/ w3 n- z int to;
2 L2 v' r; U$ P6 {2 f long len;1 c8 _2 d( k9 { j- X
4 U* S) b2 K3 S Node(int to, long len) {
4 Q! ~* B/ ^; }# E this.to = to;+ O( L5 x- E. ^2 w
this.len = len;- z" T# T. p& L, i- o1 P! Z
}
9 ^* }! y% n5 u8 N }
T. k0 [) x$ h
( Z* y3 r) ?9 r) l1 _, R' y List<List<Node>> graph;) \: V: i* C. Q; h; O+ o$ f R
- n2 s. @+ u1 Y- Y
public Dijkstra(int size) {
" n6 }7 l- L: k H graph = new ArrayList<>(size);) d* s7 K* W( z S. ]0 ]2 x
for (int i = 0; i < size; i++) {3 D: S- p1 S+ ^5 X
graph.add(new ArrayList<>());
8 e: M; L6 J* ~, p2 D }) n" j: J' |' X7 S& n$ f
}
# h- Q$ L3 E0 R" O0 g T, k4 y% B; b8 W; W9 O% U, u4 k
public void addEdge(int from, int to, long len) {! d. @+ p) l/ e/ ]0 r
graph.get(from).add(new Node(to, len));* W2 e" S) J5 h: a; b2 j9 y+ k
}2 i, o2 |. L: d/ [- c: ^
. V+ p5 S/ K l. l
public long[] dijkstra(int start) {
0 _- z; P D3 V7 y3 K' ^ long[] res = new long[graph.size()];/ t- b+ J4 H; K& K
Arrays.fill(res, Long.MAX_VALUE);
3 h. r3 i1 _5 Z res[start] = 0;# L5 d9 o$ f! U0 [, K! x' [* {
PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));& m, o0 X4 D% G. ~. \( ?- R. p" d5 |
heap.add(new Node(start, 0));% g: ~# V1 e1 k
boolean[] visited = new boolean[graph.size()];9 `8 G+ g& E' \- _! {8 n" z
while (!heap.isEmpty()) {+ s9 j3 P; R8 X0 Z* X
Node node = heap.poll();# J3 o: }9 U3 ~
if (visited[node.to]) {+ F5 V) ^, ^- |$ b$ _
continue;1 h Y; K5 @& M% Z4 Z& A
}$ L+ f6 H% M- A* N! c
visited[node.to] = true;! f: l3 ~0 F- _. B# [6 ~5 J
for (Node next : graph.get(node.to)) {# }1 ^: I3 W, D
if (res[next.to] > node.len + next.len) {
6 Z* |7 C! k" E7 ?/ @: n res[next.to] = node.len + next.len;
: Q- O. c" C) U& ~0 r heap.add(new Node(next.to, node.len + next.len));8 y; `9 d4 S4 e7 J
}: o! @/ ^7 J; X j& H
}: u3 {8 C& X5 U! Q+ z) |* R
}
9 S9 j- Y; t: q! F1 e return res;2 ?" W7 @* ~! m1 L9 ^3 i
}
0 y: V6 E5 L" j- w' S; D8 m/ \} |