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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

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

本版积分规则

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