登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的所有 K 近邻下标】
6 z1 J- G) M5 j) `4 G# F2 K5 x8 ^) R Q. G% m' B1 l4 s
解题思路
; K% a& q6 J& j6 K: y遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。
6 K3 U3 B; A" f; C4 a( K% P+ \5 v$ w a1 W# H; F
代码展示/ L) r: ]$ p" b" e" d
- ]. Z" v# }9 E& \1 c! O2 ~$ ~class Solution {
" |& }) H, J6 J" ? public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
% F) h6 \! u* ^6 P0 u+ R9 a List<Integer> res = new ArrayList<>();7 |( J6 _# v* e; G P! w
int last = -1;
# b& f; _# Y* b for (int i = 0; i < nums.length; i++) {
5 s! t( \5 R y# m" h if (nums[i] == key) {4 n, I9 W) m: H- ]
for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {
; l5 u: o- K0 {$ f: N" N7 i9 @ res.add(j);
1 }7 b* _6 V* E8 C last = j; u) c+ Q( W3 G
}9 h( ?1 r, _" k+ m$ b2 s- L! v
}
* B( p& `! I* ?2 c- h( U4 _! R }
+ x5 K5 ?: R. o' X# ^0 |4 W) R# t return res;
4 n- A0 X! E0 G- j6 g& x& w7 V }
- K+ A$ P9 X% @# _ r9 ^ u3 P9 p/ G}
4 i+ I% p, n1 |9 ?+ h$ Z9 A; i
. C! {1 |' w5 q) K% U( t) Z
) C& t* ?9 t- q0 k2 Q/ [【 NO.2 统计可以提取的工件】
4 p& f" c V5 q7 n
5 k8 e! K' T( K解题思路 t. \4 {" X, z
二维前缀和的典型应用场景。1 r4 q2 B' n% I
: A0 G, Z) x S) A. Q. D* t* P) f
代码展示
' v3 g+ @ k+ C' M: V8 J. _; A5 M, K3 J* \
class Solution {
5 }& K+ _6 k. x9 d5 { public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
/ y# T' ]) s z: D6 g- w int[][] map = new int[n][n];
' d; y9 {! C, T# q for (var p : dig) {7 O, ^ r! r9 `9 h
map[p[0]][p[1]] = 1;
2 e% U) }9 S4 V9 ]2 k0 N }: U; P$ c1 j v- o
9 g5 \7 b' w5 o4 J
// preSum[i][j] = (0, 0) ~ (i-1, j-1) square& a4 A1 X* Q; P
int[][] preSum = new int[n + 1][n + 1];6 V: K' J- S7 M5 d
for (int i = 1; i <= n; i++) {
' F# l4 B5 k9 m! f T3 f; f for (int j = 1; j <= n; j++) {8 a6 k) V5 T. Z; r; z
preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
0 { d5 ]4 r" {1 `! G5 ? }
7 B7 \/ V1 V7 X; B9 F9 U G }4 H/ s/ b6 W2 J- s# G" ?
' R& F; _* ^8 x+ P0 H5 c int res = 0;
- J8 q8 h/ x+ n; E for (var p : artifacts) {
& Q5 d# B! J2 ?& K0 } 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]];' w# l( F/ u* m$ F6 Q0 v5 ^
int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);1 ~+ X! f5 Q3 y7 H- @8 ~/ k N! l" E
if (sum == real) {
' M7 ^6 h; A w1 H res++;& f9 k* E0 g) {( h) \+ G r3 ]
}
# c, v8 s1 Q$ h5 _ A }
; I" I* K( Z- [* b: T7 h: F
3 g+ b- t. Z: Y1 A, i0 ^ return res;& E+ X0 Q O9 W) H s
}
# y- Z6 T+ H& A2 z( r}2 X! c* F! C& |0 ]" T! P
4 U" @5 \/ r6 T; D
' k8 z; R5 g! }4 W# m【 NO.3 K 次操作后最大化顶端元素】9 R; a2 x5 X# M0 g( M7 O2 y/ ~
6 V2 D; t) l d解题思路# D: J; G" `$ Z
枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。. \$ [: i$ {; J6 J
2 h @9 y4 u0 ~代码展示) @+ \3 x1 |" |- M4 n, o1 b
6 n& M8 n+ c8 |
class Solution {2 V6 U# n. {* j1 F- S7 h
public int maximumTop(int[] nums, int k) {7 W k/ [( F9 p* [* _; f
int res = -1;# S0 y/ j9 W: w; W: t5 c& e/ K
for (int i = 0; i < nums.length; i++) {
2 I. M$ u9 x! R if (verify(i, k, nums.length)) {
8 [5 H1 N8 ]! H1 i res = Math.max(res, nums[i]);
" B5 @# b# ?" r7 ?! p, S8 e }
) D$ G2 [9 {5 G x+ c# B }
5 f- q3 }2 F6 e, a- s" } return res;4 e- W \; f- K1 `# b8 [; C
}
, e( |/ K; d) Z2 u
/ A7 [+ ]1 N) C' P // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶' b; E1 J, ?& s6 R
private boolean verify(int idx, int k, int length) {0 ~( b& T2 H2 U0 t) }* T$ J
if (k <= idx) {
! M. q& V+ i# N/ D' W1 W return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。% Z; e. l k) l. t: n( H
}
" M2 O# G5 u& T if (length == 1) {$ k3 x7 ~1 `5 `8 N; B. f
return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回) `- v9 F7 ]$ F: p1 L+ F f) ]! V
}: t' D3 }, Y5 s/ |& _
return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 0$ j& P f+ t/ h1 \" w& x
}
' `* w' j0 r4 i* y}- ]' M9 q" S9 ]1 @, R" _( s
) n" |" i* `+ o8 F4 p, ^( b" i
, _8 n g5 Z* w/ V# B! g; n, l/ x【 NO.4 得到要求路径的最小带权子图】
* S7 _, t5 E- R+ E2 B4 E, K
- u3 A7 F# \3 U( A* x解题思路
& L" G& q5 O7 [, d, a求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。
5 f1 J4 g) u( B+ j
4 ]- c4 |- Z# z0 ~6 m( {代码展示( b, ~, }, n3 S0 T
% p/ Y9 c7 @& z, N5 V. ^/ t
class Solution {
. y& p) Q$ m$ _. x long res;
9 T. f7 o6 |8 r
# D0 m6 g0 n" V6 x! m( } public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {8 s7 J9 ?3 ]# _$ ^4 {' I. g
Dijkstra dijkstra = new Dijkstra(n);: w& D V. D1 D7 X# {
for (int[] edge : edges) {) M: L1 I7 U3 L7 v/ } e; }
dijkstra.addEdge(edge[0], edge[1], edge[2]);
. W, e3 N1 X3 c6 L5 _& Z! w }
0 b5 V0 T0 c" G* ` long[] src1MinPath = dijkstra.dijkstra(src1);
- L% F$ q3 p% I+ L! P! | res = Long.MAX_VALUE;& d/ z {# s, R
8 ?" v% l) r* Z O Y; e
boolean[] vis = new boolean[n];+ E7 X, q# E' r" l) b! ?. M
int[] path = new int[n];. H. @* G9 a6 Z' d+ {, E
vis[src2] = true;& r! j1 ?/ K) R, p. G
path[0] = src2;' l2 C2 `7 Z7 D3 v
dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);- _0 O' r. b% a, S# p
return res == Long.MAX_VALUE ? -1 : res;( a$ u: N! }2 h5 W4 I7 r
}, d: s: T9 c% y. _. H
* R2 F& H" t- B5 _8 d3 M) A$ z3 B private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
: a! J+ k* k9 W2 W7 f if (cur == dest) {
7 X$ \) v! K u( ^7 F for (int i = 0; i < pathLen; i++) {6 o! a$ [/ P5 r3 Z" B
if (src1MinPath[path[i]] < Long.MAX_VALUE) {
, @$ [/ B, W" Z; f3 |$ w3 h8 ~ res = Math.min(res, len + src1MinPath[path[i]]);
1 A+ B6 h6 O( b* Q3 `; l& ]; h }
) G8 X6 ^9 b: `- B& a2 ]+ t8 r/ o }
6 p0 w% K. O3 I& z4 f return;
6 _( Z! y0 r% J1 a! d; t }
% K' ~3 x4 x) U ?! w- P! Q for (var nxt : graph.get(cur)) {
9 Q* m7 a: _% @4 i/ P; J; x if (vis[nxt.to]) {
3 {- M# b, h. N continue;5 T. s6 ~- l) }: Q- g# P4 E4 ]
}) [) ]5 w$ @# a. A; [7 l9 _9 P
vis[nxt.to] = true;
# y2 y B1 p- t6 g; ]+ [ path[pathLen] = nxt.to;
( w6 Q" N% X9 R" h dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
3 n: p$ s U* I8 d0 [+ b2 Z3 K$ K vis[nxt.to] = false;$ C) ]* V, x& N' ?! v; {1 l
}( W, F- m @( j' l# E* ]& n7 o
}4 _( U6 y5 c+ s: F R8 q2 ]
}
Z- H. J: j+ i$ b6 h. N
& v, A7 c k* d* N! i' }# ~class Dijkstra {/ t2 W( O7 q2 Y( q1 A
static class Node {
! U3 N5 W* u8 y1 ~8 ~$ V! G int to;
& |- M4 G) z' n8 `* n/ g; D long len;
1 A: ?% w$ M& Y5 ` \0 a `# G' g0 G5 t8 D
Node(int to, long len) {
4 K# x& s- d% v+ I+ \# F this.to = to;
1 j# n3 M0 M4 f, f! \ this.len = len;! ^! i1 s* ]1 h- ^" g# {. r
}, Q8 s. k; I6 E3 N4 Z
}% Y& N0 ^5 p1 ]/ \
2 F' g" s% e# ^' Z( g' H$ R, A9 ]/ c
List<List<Node>> graph;
4 a4 T( l- g/ A/ B. m- l
& I6 ~. s$ V+ ^( [) W public Dijkstra(int size) {3 P0 B) m0 D- v6 q
graph = new ArrayList<>(size);
4 G6 O+ ~5 C0 U0 h0 G4 f# t for (int i = 0; i < size; i++) {
! q; d S, F! M: O2 K graph.add(new ArrayList<>());4 _' a' t9 M4 Z. p# S
}% m' e9 h& b6 x6 B' g1 O$ q
}% N/ \) C2 y! \) Y5 K9 ]
, U4 y' g7 p: {% D' [# O' U public void addEdge(int from, int to, long len) {
( a) d a2 J! B" Q: L graph.get(from).add(new Node(to, len));
3 Z) r( F6 b* E/ ?* T3 _ }
6 \" j$ y% y& L8 t1 q9 q/ x' H9 t7 v) t! F$ G: y7 l# R
public long[] dijkstra(int start) {0 l3 a0 w* u8 k# q w4 |
long[] res = new long[graph.size()];, G& }& a7 d; y. f& c
Arrays.fill(res, Long.MAX_VALUE);9 L) C" E2 F5 L
res[start] = 0;7 E3 p. X" I) l
PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
+ y1 T8 m9 k9 w- k6 I; I heap.add(new Node(start, 0));% P. d# a+ z Z3 c# r
boolean[] visited = new boolean[graph.size()];
$ d: O% g( f7 E q. t while (!heap.isEmpty()) {
: w9 i- a1 C3 Z" B6 P: y ? Node node = heap.poll();6 T2 r# H$ v1 H% q6 V. F
if (visited[node.to]) {$ C. p. v; @# h m& P
continue;
7 Q, q* D: }, s0 W }
% [+ ]- A6 e( @+ i visited[node.to] = true;2 e+ {3 I3 g6 z9 b6 L
for (Node next : graph.get(node.to)) {
: n% ]* H' t1 u/ W7 Y; w" R0 p if (res[next.to] > node.len + next.len) {
8 `2 J6 G% p$ Y res[next.to] = node.len + next.len;
( ~' `# Q0 v& ] heap.add(new Node(next.to, node.len + next.len));
0 x# l+ d/ h, R8 H/ d }
9 Z: t% t% }8 U$ o }$ B/ Z3 S+ g* M, F$ j3 d3 w' }
}' o, O/ r7 [: y2 \& Y7 n4 o" S
return res;
. }# D) F& X. [0 {. i! R }
" C: I3 i: f m% D: y) V! T} |