找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] 上岸算法LeetCode Weekly Contest 284解题报告

上岸算法 回复:0 | 查看:2165 | 发表于 2022-3-14 16:43:15 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

登录后可回复主题

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
【 NO.1 找出数组中的所有 K 近邻下标】
* A+ C$ P* R6 a5 j0 a, r* U  R5 I& s0 ^
解题思路. }$ N6 e! u: B. \/ @( L
遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。$ H. F; W4 v& ?/ o3 L2 ^

* p0 L+ H  E$ c/ \, E  v9 k9 L  I" }+ {代码展示
* {6 T8 R9 s8 G1 v' w$ U
  Z; |+ Y: c" S! b9 Y0 {class Solution {, V  s( @5 y6 N( k5 c3 ?+ d, P
   public List<Integer> findKDistantIndices(int[] nums, int key, int k) {( c1 T/ J  ]7 v1 B/ }7 L/ R
       List<Integer> res = new ArrayList<>();# p1 Q1 S; _8 ~$ I
       int last = -1;
  n- j* A5 A) f- K) z. ?* i       for (int i = 0; i < nums.length; i++) {) ]$ v9 w5 c) K, H
           if (nums[i] == key) {7 {' U, |  Z9 s. I9 g5 @$ C. x  e: v
               for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {
% c+ a3 s1 T. ]                   res.add(j);
8 ]1 Z! s/ J7 u6 H                   last = j;
/ G6 N5 s0 y+ c8 |/ f              }( o2 Y2 X- u/ L( d
          }
! ~2 d7 a9 _# P- \% C2 J      }
3 h: j* i3 y  z       return res;
) c! L+ i! j: ~4 f  }/ J4 O! ?3 _) v0 S
}
9 N  c  N- U1 k, C' v% s( p0 B
2 h* n% J" V1 y* e$ N! c+ [* M% Q2 ^& H3 }: Y1 s% I: G
【 NO.2 统计可以提取的工件】) _6 W2 Z5 {8 J# o2 N5 i9 z

: a, T2 r2 \6 ~# I解题思路
4 q$ b; T1 Y% A+ G. f& G# ^1 U! N. s二维前缀和的典型应用场景。# z( l9 k+ R7 [
2 Z9 M. @- F; U; Q" `8 ?4 I
代码展示
9 A( Y5 w4 Y7 I- @6 ~4 h# e$ V& f
$ {% H! z+ E5 aclass Solution {
0 C* Z0 E! N# K   public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
, [2 J4 H7 Y4 {0 S       int[][] map = new int[n][n];1 |6 L. M9 Z9 Z$ D* c
       for (var p : dig) {
2 r! f' j" {0 n1 V$ I           map[p[0]][p[1]] = 1;1 Z& _2 ]9 L1 V5 |4 T. w
      }
; h4 m1 T- U( E. Z% s% q/ C) I. U9 L5 K& K# H) ^& {# z
       // preSum[i][j] = (0, 0) ~ (i-1, j-1) square% I7 T. T9 B' ^9 b" C; T0 T
       int[][] preSum = new int[n + 1][n + 1];5 N  `2 L' h* X7 C2 z; Q! v
       for (int i = 1; i <= n; i++) {
# [/ [7 R% ?' q8 ^           for (int j = 1; j <= n; j++) {/ o  ~( J% o/ V! }
               preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];& Q$ ?) j5 Y; P2 P5 g9 G
          }
3 J% b2 {/ @* |) W' D! h( I      }
& U2 I7 K* E% o* ^; \; }" b$ E8 y6 d5 d: V6 \4 O7 x- d( D
       int res = 0;
8 `: E& x6 u7 b* k3 o1 l, [       for (var p : artifacts) {
- {, T" l, e; v" O( j& {           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 u8 X/ H$ E1 V. C
           int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);
- O+ n! m! d7 ]' J           if (sum == real) {: E* v5 M& ^  h& l; G) O& K3 W
               res++;& f" l$ w! L$ M) G4 }0 P) K; e* E
          }8 V6 n7 P) Y7 B/ w; C
      }0 m( _1 H: x, Z+ B

, c$ r( a5 z) p       return res;) [9 X3 y# f( T6 a* v
  }
7 \( }# ?  h+ P% o8 w}
) t6 }2 {1 l: K6 [  N7 g* C6 o0 z

0 U3 v5 ~' q! {6 c2 n【 NO.3 K 次操作后最大化顶端元素】
. y, t* G0 M# Y# Y. ~" [4 h2 l  D1 Z  ~' s
解题思路
/ G3 k) e2 ?3 Y" S枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。" w' s' N1 C. j! j+ R

0 n0 y+ Z% ?/ _$ y! _5 {; p代码展示: E; [3 f/ Y8 i2 w
4 l, v! T0 T1 x* S: G
class Solution {
8 P: I1 X; p2 I5 V  E   public int maximumTop(int[] nums, int k) {2 h8 g* J" {% S1 S
       int res = -1;
+ a! l% L0 d( ^) [       for (int i = 0; i < nums.length; i++) {
# ]" D  Z; o5 o- V( l  t6 h# `7 \0 M           if (verify(i, k, nums.length)) {' k& O7 F- w% _0 J! r% V
               res = Math.max(res, nums[i]);1 d( i7 h6 ^" V+ ~' a
          }! s( s% U6 ?7 X& s# \
      }
$ b2 {* Y7 b# m8 K# }% h* i       return res;- f4 ~0 i: X% w) [( P! H
  }
1 `5 a9 O- A3 m" M5 c6 t. j# _( p5 o
* d3 K& \* h+ c2 Z/ _' V! m* ~   // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶! g8 C- b* _- y/ N) G! V
   private boolean verify(int idx, int k, int length) {
- G" @7 j$ ~0 @+ t0 T8 L! ?: s       if (k <= idx) {
4 ^, @4 }# M/ b" C: G/ l           return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
) {! J+ r: `5 d/ m7 D* W& }" m      }% y( E  [7 s! G$ f
       if (length == 1) {
8 n6 i# p$ u6 g( ~, G           return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回9 B1 s; {( F! k# s
      }
5 C& b4 Z2 x, L/ k       return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 0+ F" g, t% c! V" d5 v4 h
  }
: Q. H7 p2 i) f& R) l$ r  d}
8 Q$ B; K: Y5 b, M0 x: l# Z5 R* M- @' g; h1 D0 t6 A

4 K" H4 t* ]! A【 NO.4 得到要求路径的最小带权子图】
; u  S9 R0 d1 n+ j/ R$ o. h& S' f2 c8 `: i! S
解题思路
2 I4 i7 {* {# Q2 v求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。
) {+ L4 B. e' A
% t) T; p* k1 Y3 U3 y7 y代码展示. t% E7 z5 @1 i( J1 I( z7 m

8 E  D$ b" \& S1 n# f4 ^) N( yclass Solution {
3 n+ \# \3 i1 j4 x7 X   long res;% \6 |; S/ a# m& q3 g# ?
! \8 D/ p+ L8 ?# z% x6 J
   public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {: r* A6 g, V( H1 \! Z, V0 j
       Dijkstra dijkstra = new Dijkstra(n);2 M# b, d) o8 D: Y4 v+ K- s9 f
       for (int[] edge : edges) {
1 b$ i6 G* N) P, y7 {3 D* F           dijkstra.addEdge(edge[0], edge[1], edge[2]);
4 i* r* w/ |( |1 I5 H% z      }
) @2 [7 w, q3 m# ?       long[] src1MinPath = dijkstra.dijkstra(src1);( U# ^; p$ u. f; S4 F$ L! w
       res = Long.MAX_VALUE;# H4 q5 |5 ?* k# B: c
4 V5 O/ p; j* K% G' _) @% v
       boolean[] vis = new boolean[n];. Y2 k3 b9 R8 A$ F
       int[] path = new int[n];
! N. }9 E; l$ f- M2 x* ?* i; L       vis[src2] = true;
6 C4 {. J; u! _" |3 q2 n       path[0] = src2;
7 ^4 [. }2 d" T       dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);$ `$ {) D3 Q! T( }* @
       return res == Long.MAX_VALUE ? -1 : res;
4 t0 u% F4 q1 q" }  }5 B# v. c/ e+ d$ f  T5 w" m; V

& d2 t* _' i' E: O" v; t   private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
9 l  B/ w) N) m' z% A4 G8 s( D       if (cur == dest) {
% E" ]# \4 _9 x1 Q, h3 V           for (int i = 0; i < pathLen; i++) {
4 d' Q* e) c- u4 O+ [               if (src1MinPath[path[i]] < Long.MAX_VALUE) {
( c4 X. y# V1 Q: M" X2 ?                   res = Math.min(res, len + src1MinPath[path[i]]);
$ k+ o% `& c, Y% P! Y( x              }
: ]! J. y+ s3 U  Z' }5 ^, `  j          }
- r) O1 ?2 }5 j           return;
# J/ N0 \' M; f+ @" a      }
: y% u" D7 @6 a' |& ?. G, ]. D       for (var nxt : graph.get(cur)) {
6 w. E5 S' [6 q( D( D6 w6 }           if (vis[nxt.to]) {) \. D0 L3 d( k( z* t1 l
               continue;8 M) a  k% I( ?% j/ X/ j% |* O5 V
          }
" a. K- f# q: S* v5 s" B, j           vis[nxt.to] = true;
4 o& d  @* ?* W3 \" t  v* ^           path[pathLen] = nxt.to;
- A" C7 L% o2 c           dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
2 Z! g. ?+ l, I' _1 S8 O+ Z6 m7 x5 d6 q           vis[nxt.to] = false;
( p% o- K7 o( x4 X7 v( C, k/ ?      }8 ]2 z% M( F3 P/ o& @9 F
  }
4 C* Y, a. {" n. }}
3 V8 v; H, L1 v4 c; a7 V: n. n7 ^6 t- G% d
  }$ c9 q8 ^9 V% ^: g2 Eclass Dijkstra {6 [* a& u* h3 t- p% f
   static class Node {% I% C' N0 h* p5 y$ [
       int to;' V1 w/ R+ w% E% x
       long len;+ t1 f' R+ S  |( g+ |
% d- l8 G) @' m3 e# ]
       Node(int to, long len) {$ [7 h* m; c7 U
           this.to = to;
. t: w/ o3 ?& h           this.len = len;
/ U  b; Z: Q: e, e! P      }
  c3 P" j$ e' P6 F  }
" B7 f- j: s, G5 r+ {6 f$ J4 s8 d: B$ P
   List<List<Node>> graph;6 ^6 e5 L8 _2 x) I4 w

# g  h- W$ B5 m$ e# E* z) Q   public Dijkstra(int size) {' H% l6 `: ]5 {; d% x
       graph = new ArrayList<>(size);) c. Q1 o% C( q9 Z% }. X- d
       for (int i = 0; i < size; i++) {
% Z) a( r' y4 y* {' S# X           graph.add(new ArrayList<>());1 i, y( N4 N& |4 I1 z  m: M/ E
      }$ ?; c3 [* u) {  o3 }- U9 ]
  }
* [* X2 G) y: B0 b: u  ^+ F- M6 O  T: w4 k$ R( l9 ]: l9 i
   public void addEdge(int from, int to, long len) {, {  n4 L1 x) U
       graph.get(from).add(new Node(to, len));
; u" k0 i8 [7 A  [  }4 E% y) ^$ x/ [
6 a1 H/ y! V6 g( R2 c9 Q$ S
   public long[] dijkstra(int start) {
8 F. s* k7 J: {( }; E6 E/ s, P9 }: S       long[] res = new long[graph.size()];
, T+ E. c9 v' l3 u9 T3 R       Arrays.fill(res, Long.MAX_VALUE);
- ^/ ~. f( N, i. ]3 [+ A       res[start] = 0;- [+ S" K4 i% Q3 C* O7 M
       PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
9 {$ E, }& m8 p) X! _5 R7 N$ t       heap.add(new Node(start, 0));4 B. \9 ?$ ]9 x( ?4 ]  j  @
       boolean[] visited = new boolean[graph.size()];, {. U) C$ S. L1 n  U0 w) L/ x8 s
       while (!heap.isEmpty()) {
9 u% P# O: b/ R           Node node = heap.poll();
4 O0 W4 E' e# m. h4 s& v           if (visited[node.to]) {
! z) v# P  Y1 [& A. Y4 Z: G               continue;3 l+ w' b6 K% Y7 r( J  k6 v$ }
          }) a- d5 p+ B' \8 _
           visited[node.to] = true;! y1 x7 y$ t7 `* K* Z5 t
           for (Node next : graph.get(node.to)) {3 }* q% I: m/ Y0 D! j4 J3 n
               if (res[next.to] > node.len + next.len) {; A7 c! L0 t8 Y* s  k( _7 A/ I
                   res[next.to] = node.len + next.len;& D+ b; m6 J3 E6 E( A8 M
                   heap.add(new Node(next.to, node.len + next.len));
6 V% G* ~. I( p1 X; I              }3 _! C& D" W. w$ w6 O# S$ i' u) i
          }
" \- _; M) `# u4 t      }1 u# Y/ B# V. ~2 q# M6 e) F
       return res;
, T6 [' E" O' w+ h- ?+ P+ K  U& H4 G  }1 _2 n2 J1 p" ], `- ?
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表