登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出数组中的所有 K 近邻下标】2 E6 H! j% D" c5 C
' p+ z* ?3 Y8 a. Y解题思路
2 x# T9 N% t/ m/ r+ b遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。
# Z; d; [" \, Z! O! G. k9 V6 y% ^
* t/ H: N) z$ t5 q, E; E: L* R1 T7 d) I代码展示
2 r- C1 U4 l: S" x4 D) R
+ t8 m7 o9 @' d$ U( e+ F8 A8 Wclass Solution {
5 ^* `# E6 p& ?/ D9 m: A# N' z public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
; g& j, e J8 k6 C5 z- M) V List<Integer> res = new ArrayList<>();& S3 H! `* @" O% v- r) W: `8 ^
int last = -1;
. V7 q6 D* a1 D) M4 x for (int i = 0; i < nums.length; i++) {+ v( ~& u! u ~
if (nums[i] == key) {
. U) l4 S" U. I. \6 y" s' B' p8 r for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {
4 R6 u# _. w4 K) ~& K( M! ] res.add(j);" R+ A- s% b5 ?$ `( {
last = j;# b' p9 Y7 m9 @3 y1 ?1 |2 b
}
+ D0 y/ v( [( T* c1 I* A4 L3 P }
3 h6 v4 k6 I& r/ A+ D) f* i }- S2 O9 m# `8 Q9 ]) H3 Z5 b
return res;/ ]+ G) X; W1 a9 l# h7 E, u: U
}+ H5 C3 C; ?; Z# Z- B, P/ A: s
}
e, H% P2 @ x7 n$ _ U0 k2 L* O; F8 s h# a, ]' o8 a
- l0 Q3 X( h% v5 O, k1 d8 p2 [6 Q【 NO.2 统计可以提取的工件】/ `, m2 s9 F5 w$ W
! _4 o5 w. z- _3 Y( g/ P解题思路
. U8 T; y! C+ z6 M* y二维前缀和的典型应用场景。
9 H" }/ E- N, f P
; x% ?- ]9 c) l) T% k+ x代码展示
5 ^+ T+ B. H( v5 V. k7 s& [
1 a4 j4 r4 V& ~# P2 Hclass Solution {
5 w% z- q; T9 ~) i public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
4 a4 s; A* u4 |+ y0 v/ ` int[][] map = new int[n][n];2 e0 u/ A8 H# Q5 ?2 V
for (var p : dig) {
8 m0 p$ z4 L' x( _* |( D/ b map[p[0]][p[1]] = 1;
' M. V0 D6 m. T1 _' h$ K5 T; Y }
0 @+ v% V" `5 D5 ]8 s0 m4 e
9 |4 i: O) X4 S4 D* ^ // preSum[i][j] = (0, 0) ~ (i-1, j-1) square. S. ?7 s: C* Y- ?( Z I1 [
int[][] preSum = new int[n + 1][n + 1];2 @1 s- Z2 v# d" O. Z( v
for (int i = 1; i <= n; i++) {/ t$ b( ^; S; z3 @
for (int j = 1; j <= n; j++) {
& B1 k! }' x- m- R- y6 I6 V* L preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
( ]& q; o' f {$ u* F }
" t9 G7 J( t- i5 U; [ } A S+ T( |* Z
+ N5 W1 s3 l0 u* R$ `* C" P int res = 0;$ s% R7 M! [7 h: s% Q& Z. c
for (var p : artifacts) {6 B# B O. \( {7 f
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]];
" O3 d% M% j X' D4 X int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);) Q [# d* b; ?2 J
if (sum == real) {4 c# Q9 q# q' Q& w
res++;* |* T- _6 t0 z: c* S. G
}
- l) P: m a& I }
& T5 n8 i3 r8 U: o% D0 |. P/ M
- v* ? u; M- G' D4 C return res;+ j0 ~- G" U# Y
}; y2 l2 \5 F; D
}/ [6 L5 S( G7 K- _
: h- R; g' [, \) F' W; y) V/ u- l* q/ R
3 N! d( n- q4 q c( {& O【 NO.3 K 次操作后最大化顶端元素】4 H" q9 D- P* n( `8 [+ e& W" q$ v
1 N+ C# I! ~& x+ A* @* t& Y2 {
解题思路
8 j7 F* v \- ?* o( ^/ Q! }枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。8 _5 D2 x7 z u
9 a! K6 U/ `$ _, w; Z代码展示' r) {7 J p2 e7 ~
/ l: }/ g/ ?$ n! z8 Y+ o. G
class Solution {! P+ Z% R* L \) V: t# |
public int maximumTop(int[] nums, int k) {
/ I+ x7 e \1 T: R* x2 @ int res = -1;
f9 {8 Q; z7 r! v for (int i = 0; i < nums.length; i++) {
$ l: e5 f" L- S, y if (verify(i, k, nums.length)) {
; k% J9 y- F2 O3 w2 d, _! u- J res = Math.max(res, nums[i]);
) k) N& d7 [# D) p }- q6 _0 S6 S, H7 Q, z" m( D
}
$ }7 \: [! o6 V return res;
) `. d: }) S! }7 q: a$ d# ^: w }
- u V+ m" }4 F
$ H+ A( Z; b- y // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
c# N! p. W% E0 M, b& s0 f private boolean verify(int idx, int k, int length) {- j* \1 w9 x0 a
if (k <= idx) {
! \8 o: w1 r* r5 o* v5 o7 c return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
V5 u" F' f4 u3 A1 Z) I }9 \# |: S( o2 S' L( I2 n
if (length == 1) {
) t$ F% a4 X& J: G return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回# v- K& R1 H- ? T
}" I) c% ^' s" k
return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 03 |& A9 h5 J$ a1 ^) H
}
8 A3 y; }" z; d# X6 P) y}1 _# n, P3 X0 ?5 V( q U* c
y/ j9 g, b+ [3 j: ~
% e2 M( O- W0 B$ S. ~【 NO.4 得到要求路径的最小带权子图】
' b2 _% { z ]# @8 `: o& q
9 u8 [6 \# d3 a6 |: m+ \解题思路
r% S0 P5 D0 B3 I# M' R求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。5 w4 a3 B- s; G: m4 d
' \9 Y$ k! b) @, L/ \" d
代码展示/ t* K. p' u& r1 H
" m0 u/ D7 B3 x2 E3 N: d% B" T$ Cclass Solution {% K2 i8 Z) U: L5 m& N
long res;9 A" u; u8 ~7 V$ x9 R" C
" F m: D' a/ \1 K9 L2 S
public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {9 W# U% X. j1 W' C5 m" c9 A
Dijkstra dijkstra = new Dijkstra(n);5 E, }5 s- r& d1 b$ i+ w! b4 Q
for (int[] edge : edges) {" B$ L& P% T" t$ l1 D' r" P/ V
dijkstra.addEdge(edge[0], edge[1], edge[2]);
' D W4 e0 {" F1 U0 H$ F- t u4 C }
! ]1 T. {5 e% h) E2 {- K6 j long[] src1MinPath = dijkstra.dijkstra(src1);% e9 }. r3 Z, K
res = Long.MAX_VALUE;
; P1 E5 z4 _; _+ h* R" r; |% |. B* v* j/ P6 q
boolean[] vis = new boolean[n];; T- X9 Z) m, ?# Y$ N; k
int[] path = new int[n]; X) d T% ~2 Q, C& h( E9 E2 y
vis[src2] = true;8 Z( R4 w* F- n; _! P
path[0] = src2;; ^* K% c) R. U/ X0 `8 Y
dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);0 {: j4 X. D3 I5 ]8 x
return res == Long.MAX_VALUE ? -1 : res;- w+ j- z! ?) L0 }$ w+ e
}
v( A/ U: N! f4 i+ n9 U" J9 w, A0 }0 L7 Q1 J. h/ T9 }
private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
0 C5 A# c1 I$ Y# w- L( _ if (cur == dest) {7 T) N) f" x$ q; f/ u, [ K
for (int i = 0; i < pathLen; i++) {: E. B7 H7 h8 W+ H& `+ S
if (src1MinPath[path[i]] < Long.MAX_VALUE) {
+ |! x, `# R$ j6 Z7 z% d- o res = Math.min(res, len + src1MinPath[path[i]]);9 K0 q) n' L2 ?0 y
}8 H2 b) G, ]1 r: w) ?9 W. J
}3 v$ C1 x# J, ]9 b; m
return;& X' A% Z% x% B
}" [+ |0 |; {1 H! V' a; o0 J7 X
for (var nxt : graph.get(cur)) {- e4 F, j0 c/ a. s9 N: l' i
if (vis[nxt.to]) {( \- K; v& F' R) |4 g+ o9 q* e
continue;8 `% T7 l/ y& P3 G+ X) T8 M* _
}
, \# d! ?" Y; |! ]2 @+ D! ]' Z vis[nxt.to] = true;& ` S+ x1 i6 b$ r- ?" H ]; p* I
path[pathLen] = nxt.to;
* W0 P v. H; b- q& ~ dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
4 W) |; z$ B; _, Y. j& A3 b vis[nxt.to] = false;" f2 z8 z0 j. H
}1 x1 [. T5 m' U1 p
}
- O' c+ l0 C3 q& V0 S$ N5 y; n6 Q) ? D}
& }( S8 o- q5 ~8 B3 @
3 N: g, u( }, R+ b6 W/ b& sclass Dijkstra {
0 P# Y/ Q9 A0 }2 ` W static class Node {6 m. x) y8 A1 S- ^4 V0 a$ T
int to;
) w0 d ^3 x1 y! z long len;% Q2 S! T6 V: y, X1 K, g! V
/ g) u+ p( u, Q2 D% W, Y. N) K Node(int to, long len) {! s1 W0 c9 B& Q9 v
this.to = to;
2 e" j0 e# s8 g9 W* @1 J+ W this.len = len;, H0 B, b' {) m
}: _7 J: p7 O% o- n
}' u+ u. b R+ H
4 ?" K% \1 j- E ? List<List<Node>> graph;# j2 `) \0 a ^$ L! Q
) j, A0 I5 }* j9 G public Dijkstra(int size) {) q- v$ k6 U0 ?4 I
graph = new ArrayList<>(size);
" \0 b/ i" y4 D) Y/ X, P8 d for (int i = 0; i < size; i++) {
, w/ L/ H5 \$ f, @, m5 Y graph.add(new ArrayList<>());$ G9 m4 t& `. J1 {* a3 Y
}, B( C( k. f7 Y7 }- I! _
}
J; B. _1 N! G! ?2 T' G
, l' S j0 K& W9 _1 D public void addEdge(int from, int to, long len) {
% [4 C- b5 x( K/ o# e( U3 w7 e. r graph.get(from).add(new Node(to, len));
$ C+ f* Z2 b# Q2 A) G% T2 s }
+ _/ Q# S6 }% f
' N7 Q; k# H7 p4 l6 c% R5 e) P public long[] dijkstra(int start) {
& D, L7 b& h- ^ long[] res = new long[graph.size()];; o8 R+ C/ s% M2 }2 v3 u% N
Arrays.fill(res, Long.MAX_VALUE);' A) ]6 m( j) a- v/ \
res[start] = 0;
7 t1 w* z% d. r2 x4 a$ X PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
i! ?3 Y# V/ j! N! ^ heap.add(new Node(start, 0));
) {* M8 \( {& H5 q1 v2 R, l5 z2 D7 j( ~ boolean[] visited = new boolean[graph.size()];
6 j: t$ j& Z" [ while (!heap.isEmpty()) {
! \- I5 @: W* Z, z+ _( \ Node node = heap.poll();
" z! V" l# k5 U1 E0 e' k+ E if (visited[node.to]) {
* ~9 T" C9 k0 @( h continue;2 K+ I; q) ~& b/ \ ?
}" A6 {+ M- j8 Y) ~0 A6 q
visited[node.to] = true;; M' `5 q& l1 E
for (Node next : graph.get(node.to)) {) x( X8 g+ v9 ]6 J
if (res[next.to] > node.len + next.len) {! }6 e+ O' n! M1 z' [8 j
res[next.to] = node.len + next.len;- j. r& w. q7 A3 o
heap.add(new Node(next.to, node.len + next.len));
. R3 L$ R$ |( \% u# T }
7 F E, I O6 f }* ?- W0 f9 X4 O. y1 X
}
9 }# f' y B# k3 S+ J: A( k return res;3 u4 [- w# V* I
}
) u+ k% ?6 p$ }9 I} |