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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的所有 K 近邻下标】
! i, N4 V3 q+ G" C; c- M9 N& b* T0 V8 H. q3 ]( h1 C0 K5 y2 Y
解题思路! q0 H* S! p1 q& {7 Y
遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。
2 C, A9 K2 o& f6 d  U3 o
! M! [# G% c5 W  V# u7 j2 d8 l, L代码展示) Y# [; ~5 c( m& B
* x' P7 l& F' z% I: Q
class Solution {; T+ B0 n: G! S$ @' w
   public List<Integer> findKDistantIndices(int[] nums, int key, int k) {; R2 ?5 ]9 V0 g; G" Q0 K6 b
       List<Integer> res = new ArrayList<>();
' `. o4 E( Z0 a/ d2 p( G6 X       int last = -1;/ {) I7 ]1 e" O+ I
       for (int i = 0; i < nums.length; i++) {9 |6 F3 P- h3 e( v5 X
           if (nums[i] == key) {
3 p* F& z- x! d3 n  q8 v6 P$ D               for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {8 Y7 P, P2 ]9 Y3 L9 _
                   res.add(j);+ b3 o# G4 }4 q) B1 ?" f
                   last = j;
# q* x; r9 m  l              }" |* D/ d- Z9 Y  A* ~4 Y
          }
( F* ~  L  _7 S& Y1 c  s3 O6 J      }
* A' v- d* P, B/ \- W0 j* J  m       return res;
+ \% d; }  v4 L! @( h  }* ]) d! G9 f7 _" u1 s' J
}
  `- \  \/ x0 v, j4 \- H% H1 j9 V* U: P! |; R; s! _$ P; A* F
  e9 l  J6 ?2 T2 H# e( B
【 NO.2 统计可以提取的工件】
9 M) h1 `. o4 d8 ?; J2 w# e& O2 e4 m; N9 ?) S: R1 P: b
解题思路
8 ?' E4 ]! \9 h$ `" E2 c5 R; m1 d- s二维前缀和的典型应用场景。" v' `( e8 z! q* A- {
% @* `6 S# }; ~4 o! D0 h6 _+ x5 v7 b
代码展示
* e: Z6 Z8 |* q+ ~% n, v
8 }- {* D& f/ N$ V% V- qclass Solution {/ s# k7 Q9 R" K% m: w' e  M
   public int digArtifacts(int n, int[][] artifacts, int[][] dig) {9 M6 V" B7 c. h+ z
       int[][] map = new int[n][n];
0 _5 ?( R6 L! K       for (var p : dig) {% [4 I) H) D" s$ }
           map[p[0]][p[1]] = 1;2 W8 u! z3 B4 T* f3 H. u, _
      }
: P; b" v1 d) z1 P* t/ u) g$ x: m9 }, q7 R) F
       // preSum[i][j] = (0, 0) ~ (i-1, j-1) square1 S# c- h7 S8 X( z& g' u4 v
       int[][] preSum = new int[n + 1][n + 1];+ {9 }5 {$ |$ Y& V
       for (int i = 1; i <= n; i++) {( ?' H) Z$ I; i7 [$ `' I  l
           for (int j = 1; j <= n; j++) {
$ a% E' z& [3 @  g: o4 |               preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
" K3 r! f) `! i) P$ c          }, T7 z# E6 F, V& a/ }  {
      }
$ T: Q# ?1 s* C6 e3 W. j1 D2 {
: l1 h, H9 P% Q  e! l  S) H       int res = 0;
+ \; v- \& a+ Q4 t: ~       for (var p : artifacts) {
2 F5 ^1 {! V# w- K           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]];6 r; `3 Y4 |- N2 G2 O) g6 B. t
           int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);
9 _3 \- M5 R! D           if (sum == real) {& o3 g5 F$ q& ]
               res++;
: Y4 r2 E; i6 F- d          }
2 P  Z. Q) c: V2 R+ }      }
( G$ y3 {* B$ b: x1 @% a# g0 B1 D1 B3 [6 a, |$ y  y0 q: L# [
       return res;' a& h$ e+ a, o1 `5 m
  }. @  d, s, S6 F# t4 ]9 r: Z4 \
}
6 v0 s6 g' {; ?$ g# O
! I& B) z: m% A2 u. n: Q/ z
6 S* h* L5 P0 X【 NO.3 K 次操作后最大化顶端元素】
7 m% G& N8 E) L$ V/ W5 A- x. l; b& ]5 [
3 f0 u8 M8 s. A/ M+ u" y解题思路; H; Q* X8 e0 K3 r  |* N
枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。
0 `: _) s2 i, c5 Z  S" X* P: S
代码展示
9 d' O+ |! o/ C$ C) q6 ~. ^. k7 ]( r; ?$ P
class Solution {. O$ X4 l% b* d3 t# |
   public int maximumTop(int[] nums, int k) {
  F7 B' S: w( }, r  ?3 Y1 A/ \7 u       int res = -1;* @7 O: S( H( K5 C
       for (int i = 0; i < nums.length; i++) {$ j9 W8 N0 b2 t* U, g9 m
           if (verify(i, k, nums.length)) {9 r+ c2 S: V% e% ?6 O
               res = Math.max(res, nums[i]);
" ?9 o" Q1 K* V- I0 k( ]          }" E  b3 }, o, J7 g
      }
5 Q' g& Q& l# c' B       return res;
) g7 q3 V3 F# I$ \  }7 Z/ O7 M0 X3 j, H- e, \

2 n# m6 V. |8 N5 c   // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
8 T& r6 e! w+ R; |% W  O6 M   private boolean verify(int idx, int k, int length) {& e" M* P- G7 P& V) G; r
       if (k <= idx) {9 A$ G/ Q; x9 M0 I+ M# E9 U( b
           return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
5 [4 J' f0 C8 r' R9 l      }
* l3 O  i2 N. b5 ^$ O       if (length == 1) {9 b7 k8 }. g. V$ B9 U
           return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回" u" T' w# \0 i: X
      }+ N/ E$ T3 q. o5 I& S( w5 i
       return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 0
7 L" s6 c. w5 g* h6 ^( }; D$ f, r3 L  }
, K" a5 O) T1 t}
" s; G/ w$ `! }, b2 {. i  P' Y

% M3 u/ @9 D& |/ a4 C% i. N' d0 w【 NO.4 得到要求路径的最小带权子图】
" V9 F) G# s7 `9 u( A6 b% g" ^3 i, @
解题思路
& B7 {" d* O8 ^: Z求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。
, `& n" K  s" s' @6 ~% @4 c1 e* g% b/ y
代码展示8 }- R! P" J, j0 i

% T0 x( p( U1 `6 _class Solution {, y) @* g3 S4 A4 U3 v6 \+ P
   long res;
' h$ T1 W/ A( A. d7 Q! n
4 Y- S7 c4 V3 `   public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {) y# v+ ^. {2 Y: e3 Q
       Dijkstra dijkstra = new Dijkstra(n);
4 b1 [5 c8 |7 E' [       for (int[] edge : edges) {# m# w/ [- A' H6 X+ Z! h6 _
           dijkstra.addEdge(edge[0], edge[1], edge[2]);
9 l/ c9 l" r: Z+ s( R$ D      }" u  Q/ b5 L  U+ n' a
       long[] src1MinPath = dijkstra.dijkstra(src1);
1 p/ i( q( ^4 K       res = Long.MAX_VALUE;
  A( k2 i5 J) }
3 L6 ?5 ~- m. m: A$ X( o) L       boolean[] vis = new boolean[n];
& Z4 I3 U4 w# ^: Q% o' n       int[] path = new int[n];
# q; `. f" u* i8 R4 U! H8 v       vis[src2] = true;
4 Q( }5 R& P0 U7 l( w4 Z( R- M0 c* z       path[0] = src2;
& Z4 j+ A% e. P- t2 A+ \& S' a4 R3 q% P       dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);
1 P* h0 D9 k6 Y- Y5 D7 ^3 v4 E       return res == Long.MAX_VALUE ? -1 : res;8 D# Q, i$ v/ {' c- r
  }/ a( ~& F8 v; K9 V' M
9 ~6 f. G5 H* D- U3 J5 S9 N( G' E
   private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {, y2 S+ V+ _1 k
       if (cur == dest) {, E% o7 v' h  D3 g3 K! J9 D
           for (int i = 0; i < pathLen; i++) {6 S; D& d9 E( W3 y9 C
               if (src1MinPath[path[i]] < Long.MAX_VALUE) {
5 w% S8 x9 |4 N9 Y                   res = Math.min(res, len + src1MinPath[path[i]]);; W$ V  T* ~# p# T1 ~- L5 v* |
              }
2 ^+ u7 m0 N) \          }  p  U/ o$ v7 V$ @" ^4 F
           return;
$ ]( b3 F. F$ ]# \3 P      }6 r* w- D5 u  z' J: Q+ t1 N
       for (var nxt : graph.get(cur)) {4 A2 b$ j" x, k
           if (vis[nxt.to]) {/ M1 e- [; O( G; P2 g; b& @: f
               continue;
7 y: k% I9 r8 C6 _& f# a1 q& g0 C          }* p! T, [1 ?" m+ H
           vis[nxt.to] = true;( v: H- D5 ]3 d2 j6 b9 S
           path[pathLen] = nxt.to;+ u  X$ }/ I, `/ Q, `
           dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);5 F* Z. {- g8 Y& _1 T' ~$ O4 t
           vis[nxt.to] = false;
: l: @. H* n0 [/ y6 e  O      }1 O9 l0 b8 m% S. \3 ?: Q8 Z! F5 f
  }
) j7 O, a( g2 M' i# M1 \4 L2 i}
/ _/ O  d- \* ~* j: S; W9 E: d. v2 n" F/ E
class Dijkstra {6 w8 r. `, R$ l' X
   static class Node {+ T; H1 {& P2 a0 d5 ]; n, Q
       int to;
) x" C4 E, r" G; j       long len;! l1 q$ i0 H: W

2 q% A: {8 P% Q8 Y" _9 a  v9 G       Node(int to, long len) {
5 o" n  q" K9 C5 }           this.to = to;
4 @3 d7 A$ w: b' U" z           this.len = len;* ?0 ?- a! Q$ c  X8 y" z) |
      }
3 E/ E, g9 C5 d( Z' Y& @  }7 w+ B  |- I/ g2 {! \  E

5 Q' _; x1 J" S+ G! B   List<List<Node>> graph;" W& @) a) Q: M- \) K' ]

# A( j! K. G( o! d! n- P   public Dijkstra(int size) {! L' K) |) T# P( H6 {: x
       graph = new ArrayList<>(size);
9 `& z7 T; `1 I       for (int i = 0; i < size; i++) {% N3 C/ s5 h0 R) A: a, V' H8 [
           graph.add(new ArrayList<>());
- A& x3 @; W! r9 S, i" q6 ?      }
/ ~( E. S& O7 R% ?2 ?% y  F4 f  }
- W7 p: e3 B9 _& I( v: Y/ V
$ n' N/ x6 y8 p, S" b   public void addEdge(int from, int to, long len) {; h9 Y. M  N  W5 g0 h
       graph.get(from).add(new Node(to, len));
5 Y  l; I* E' N# o" m5 F5 I) Z3 H  }
0 z, v' N4 x9 I: a* E
9 L2 T2 X% B9 t" _( D   public long[] dijkstra(int start) {7 d/ D) ?3 D% x" S  x+ i! [, R4 `
       long[] res = new long[graph.size()];
" H% W8 r5 u, L       Arrays.fill(res, Long.MAX_VALUE);
' R6 C( u# H! O8 O1 j# u       res[start] = 0;9 }8 j: U, a; Q7 d6 B
       PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));1 X  r" a$ Z: f! ^& n
       heap.add(new Node(start, 0));
, U5 r1 ?1 O0 N* E5 g* d       boolean[] visited = new boolean[graph.size()];
, v% G8 i% m+ I5 g/ T( S       while (!heap.isEmpty()) {
( D; p  w& {9 y4 h1 H& y7 `$ T           Node node = heap.poll();, d+ |' i; y  E" f! O1 v0 ~- }$ \
           if (visited[node.to]) {! J. M/ D: s; g* N3 }
               continue;( e* {7 E; o3 Q7 U) @1 m  X% s
          }- W; l: h2 S; z
           visited[node.to] = true;
  R7 W/ [8 U" Z! C           for (Node next : graph.get(node.to)) {
% Q6 l' U: z5 h) h6 q               if (res[next.to] > node.len + next.len) {  W, L7 i7 X8 a7 @# y. P. W
                   res[next.to] = node.len + next.len;
; f! Q% b4 ~8 L5 x& u9 v                   heap.add(new Node(next.to, node.len + next.len));# R8 Y% H% `$ a0 a
              }
5 x" T7 f) L4 `          }; ^/ _( u- S! R1 g
      }
* D' I0 ^% L* u0 w0 j       return res;
+ z! h( V' F' a' a' R  }
% a2 g9 y$ S" g" R4 D( V}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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