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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

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}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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