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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的所有 K 近邻下标】
, t& Q& `) O  M0 P4 X# W! J  D- v% P' Q
1 g" {9 ~5 G9 n5 X7 j解题思路
: [1 ]# e/ J  P2 G' W  t7 Z. ^. v遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。& N, o: I/ \/ B; u. W" g$ g+ ^

7 H) ]( v9 H: [; r6 l& ~代码展示6 |4 W. W; j1 ^0 s
# x  N8 r9 _* n9 K% b) _5 g! X
class Solution {- _; }. u3 `9 G. d  O! S( K% u$ m4 |
   public List<Integer> findKDistantIndices(int[] nums, int key, int k) {" Z& ?9 h6 A  A. C$ B$ z+ t3 P' C$ ^% X
       List<Integer> res = new ArrayList<>();9 {) i( Z" \/ A% B0 \: l  e% V
       int last = -1;
: U/ K' H  j+ f3 [% m       for (int i = 0; i < nums.length; i++) {* E! u1 p- o2 n- Q% q2 R
           if (nums[i] == key) {
, e- s' G- X: t2 ]# l: }, t, F1 g               for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {) G% w* \! k5 j3 u! `
                   res.add(j);
. o1 \1 x3 a# b4 l1 e8 b                   last = j;0 J% C) q1 N9 M) G% k
              }* T; V8 N1 K9 T9 j3 [' h) P
          }- `5 W! E4 o5 o4 u  {
      }
' j3 I$ h+ t1 |       return res;
* r* Y+ v3 J; M6 b' o  }4 A% s* r3 A$ i' J0 s4 {5 g" x; Q, K
}2 K7 D0 p' \" Q

1 b+ P. J# X" q7 G
% a. T3 x  |2 W7 H: m/ M& t【 NO.2 统计可以提取的工件】
) ?8 a- \4 p. Q, c+ o
9 P% s# n, I2 n2 c# b  w解题思路
3 _' b- l  G- w  a二维前缀和的典型应用场景。
% W1 [' B) T- p5 \5 H$ B" n$ r+ B% q& t2 L
代码展示  ~, N) U" H6 L

# b3 H% E! Q, q, O: m. Z2 T; g/ H) Nclass Solution {! H; A* o$ g0 M' _$ k2 x7 q0 K" S3 `; e
   public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
. {  K4 E) k; y4 S: y       int[][] map = new int[n][n];  I. P# w9 y- O3 Q
       for (var p : dig) {: I' g$ X* t& Z8 w& E
           map[p[0]][p[1]] = 1;5 Q0 D$ A5 P) o. \+ A1 `' f
      }. `" ^/ |7 Y# e! o1 Z, N0 b# O2 P1 Z) S

6 C' W- `# }6 a       // preSum[i][j] = (0, 0) ~ (i-1, j-1) square) a( W( y8 f; o% K5 \8 [* o- Q" w
       int[][] preSum = new int[n + 1][n + 1];! n/ }( B: I3 d  F& m$ s: b
       for (int i = 1; i <= n; i++) {1 f* |) `, P0 p: W
           for (int j = 1; j <= n; j++) {$ f, x+ s# ^- {% y8 H7 ~
               preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
6 ^3 a6 {7 N- N( P! _& Z5 d3 r6 w          }
4 `) s7 x# C5 m4 b; `      }  P5 e) O+ i3 f" v) r  Z
6 A+ {7 E- Y! T8 f1 N$ S: ~
       int res = 0;
, u- o4 @# ^$ x' m/ V5 m6 ?       for (var p : artifacts) {
, ?% n+ ?- z2 l" t           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]];
) d9 i; D; V- |) g* T( ^           int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);
: s; r9 ^& {- p  P) |           if (sum == real) {' `5 K+ P3 W" T3 U! ]6 @
               res++;
$ Z7 f% Q/ Q0 E& l! S1 {+ O. Y+ b: a          }
+ R  N. T7 e) r# D) D! e      }
# Q9 W7 L7 ~  D9 L2 p0 j& R7 L2 q
: m% I8 C5 g2 ~       return res;
4 O% [! Q1 u; p  }8 X2 a7 A1 G- j/ B9 x# k! u3 @2 i
}
8 f7 N* h4 U" b% D+ o0 m) L) d3 y$ r
( y# f5 |# r+ y9 ?
' e* N3 K, D5 ]) C9 E: F* |【 NO.3 K 次操作后最大化顶端元素】1 `4 |3 s, X0 U( `9 t( H/ k
6 j- s) w) f- t- x1 a9 e# ~
解题思路# f1 h# K! A% X
枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。2 o1 B) [+ Q3 }0 s

! C- G. m$ X) e8 _# r7 ]6 _代码展示7 J  I  Q9 p3 x) h# M' g) N% {/ o

' U: _* V6 r% uclass Solution {2 b- d) m8 ]2 P' D
   public int maximumTop(int[] nums, int k) {3 t  R0 l* d# z: I! {4 |9 Z
       int res = -1;3 X1 Y/ I$ t, K4 R7 h3 J
       for (int i = 0; i < nums.length; i++) {+ \7 L2 J- @: e" K' b' u. f
           if (verify(i, k, nums.length)) {
2 z$ x( I7 Y" ^; c3 [               res = Math.max(res, nums[i]);5 u$ d) D4 N% S3 O& S, A; {, x
          }
9 ^8 ^( L1 v  [. M. j      }4 L1 H. T: T  F% {
       return res;
$ Q' m  ~! l3 p( C8 M  }
( s% Q9 ?: h" `& h8 K
, _- C9 u8 m( \7 R, M   // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
- |7 d$ Y: @8 i" F: h, l; {   private boolean verify(int idx, int k, int length) {9 s+ p5 z4 I, c0 H1 _6 t% x) Q) l
       if (k <= idx) {
$ Y% `5 K% W/ C           return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。0 ]* w* T% b9 g) ]- Y
      }; q0 t5 W  L( I  m  g4 `
       if (length == 1) {
. L& T6 B+ P1 v$ e- m% M           return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回  F/ U8 p% `6 O/ ?% q9 ~
      }) Y& C* p7 K% H( P6 v
       return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 0
; O5 R+ }* j1 t; I0 k! S9 K9 i& u  }: r& c' q" }9 W& g  v8 m9 e
}& D# ]* J* W$ y' h( k6 M

' y% Y. Y$ D! b1 K( I7 E5 t# w$ }, W
【 NO.4 得到要求路径的最小带权子图】8 n/ j! M) l( @

: E- |) u, B- u3 O2 U解题思路
# L; y8 n: b: H' ~$ n) o$ p$ u/ g, ]求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。8 y( T1 K) d6 g" w$ n
, C1 T$ z: O7 Y( O
代码展示
/ Q% ]1 V4 e, O- u6 w0 r) a0 i3 |# b; j2 l9 R# N
class Solution {' q9 M5 H1 W0 m+ r  \5 v$ J- N
   long res;
4 r/ u; g0 U5 k  S- o
& B9 {+ K4 ^" X* A. x   public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {& W0 V5 g  y8 q6 X$ t; T$ W
       Dijkstra dijkstra = new Dijkstra(n);) @% j  U/ P, v) h: c
       for (int[] edge : edges) {
+ j2 @  L4 y1 M6 j. H           dijkstra.addEdge(edge[0], edge[1], edge[2]);' X. Y) `" x: L4 D2 r% s
      }
; G5 X, s# e( X) R5 E- N       long[] src1MinPath = dijkstra.dijkstra(src1);
; B* ^4 m$ @5 v       res = Long.MAX_VALUE;
' Z! \. z$ w4 J, [7 C9 v9 v$ k& y" Y3 b) z
       boolean[] vis = new boolean[n];
3 ^4 s  X' T+ j2 j, T       int[] path = new int[n];
0 P* V# \, G) U# C4 v) @* z: X       vis[src2] = true;0 ]% j) Y: O. f+ N. f- J2 m$ {
       path[0] = src2;
" c& h  `$ n- w6 H! o: V5 K       dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);
- W' t: @3 d" a' S# n       return res == Long.MAX_VALUE ? -1 : res;& [2 b& Z2 t' v# z5 h: {$ b  g/ h
  }: o6 {% u" e' Z

  F) h# j4 g6 S. i9 q6 t& y   private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
9 K3 i+ c( x+ f: N% m, I       if (cur == dest) {
; n7 F* l  m5 }, |) Y           for (int i = 0; i < pathLen; i++) {
7 i! L* Z" F& m- L6 C               if (src1MinPath[path[i]] < Long.MAX_VALUE) {
1 ?) S4 l7 m  ~3 h$ D+ @                   res = Math.min(res, len + src1MinPath[path[i]]);
4 z8 W0 A5 P0 q7 a% U3 u; S              }5 j, ~  R# T/ W
          }  |" w3 I0 M0 n' J9 v, g
           return;" s+ D2 A  T7 Q8 e& z0 M5 j! b
      }; p! i( k' N, J% h( I  Y& Q$ R
       for (var nxt : graph.get(cur)) {  h1 t; Y. i$ T8 Y7 O2 A) M6 C
           if (vis[nxt.to]) {) L2 i- {6 {' o
               continue;
1 K7 y  B& n$ |; o          }
( ?3 N  k1 F) M" D           vis[nxt.to] = true;( A' o. B/ z* @
           path[pathLen] = nxt.to;
! ?/ c: g" d: v5 X# b5 }' i           dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
& J% f% e9 j+ U6 Q1 P' ?* R1 B           vis[nxt.to] = false;
. l! |9 M, d) x; q9 M6 J      }# w3 F, \4 P3 u: Y- a6 h
  }
$ a: Z& `9 ^) s9 z, g}) R- O0 O; ^3 ?. X( V
" T: r( x3 c5 e
class Dijkstra {
6 V* d0 S0 R0 b' w2 X) j   static class Node {8 @: K3 z; z( U7 I
       int to;
! F: I! P3 V; o2 K1 I       long len;& |6 h( v  f5 O3 a0 P9 z
, d# }& A2 g; o0 F& D! P
       Node(int to, long len) {1 e( }) @7 J8 I; G4 x+ R
           this.to = to;6 D& }1 I" ^0 |! Z2 r& Z- w% M& Q
           this.len = len;
4 b- g3 s4 E- _  g      }8 u; F6 w& i/ J) U; D; p1 J
  }
) P  Z( x7 b) P& f, G! W- E7 a$ @6 i. _( g9 O4 ^% c: M% Q
   List<List<Node>> graph;5 Q6 [* w, N! `4 N. h
5 E& a7 j# |/ W! V' K
   public Dijkstra(int size) {
# x( F  E2 P+ }- [  c       graph = new ArrayList<>(size);# e: w5 H) d# X
       for (int i = 0; i < size; i++) {
( Z+ K* r. W7 d1 y           graph.add(new ArrayList<>());! q1 M+ s; M% P6 P" T; c- @
      }0 H+ ?0 b* V' a) b  C
  }7 B6 u- z1 u$ j% B+ S

' C+ x* B+ V, N& [4 O   public void addEdge(int from, int to, long len) {
7 M. }$ u. \( O9 S9 T       graph.get(from).add(new Node(to, len));
1 ?' Q8 }: T+ k  }
5 ^0 E& G- J# ~( L0 P, m
2 J' q3 Q, t/ _' s- w* ^) l   public long[] dijkstra(int start) {( y: J( ?$ k4 i$ _- X) o" Z
       long[] res = new long[graph.size()];
8 V7 P/ C/ |9 P9 `       Arrays.fill(res, Long.MAX_VALUE);+ m$ \, z4 G* I
       res[start] = 0;, a0 |! P) v& V$ M" x, ~5 _
       PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
" K7 m/ ?' N7 X+ j0 k/ i2 m1 Q       heap.add(new Node(start, 0));" m2 m/ V( v0 @3 d
       boolean[] visited = new boolean[graph.size()];- l" \- N5 t1 h+ S. D
       while (!heap.isEmpty()) {
6 U, P9 \; I' v7 }           Node node = heap.poll();
5 Q& G; i+ E4 a8 A- Z! D, c           if (visited[node.to]) {
% l6 p3 P& A$ g* M1 p+ G3 Q               continue;- @; B! C8 K+ Y3 ]* x3 U
          }
9 ]* I) E& T" W1 q3 O! ^           visited[node.to] = true;5 _9 d9 `, G* o( u
           for (Node next : graph.get(node.to)) {/ f9 T4 P  ~3 x# z$ {4 v3 F
               if (res[next.to] > node.len + next.len) {
4 G7 e" v2 O9 V5 g  j6 I, N7 C                   res[next.to] = node.len + next.len;, P9 c& f5 i+ G6 Q0 R
                   heap.add(new Node(next.to, node.len + next.len));" Z* C; Y& l* n2 B, ^
              }: E0 t% j; Z5 }( D& L1 E' Q3 `
          }( Z9 ^; {% e' w; w- ?( p
      }, b; `8 w$ h( d' F1 w7 g
       return res;( E- s2 M9 I; }) [( p; Q. F
  }
* s" N1 M7 q3 t) p; C  X}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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