找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的所有 K 近邻下标】2 E6 H! j% D" c5 C

' p+ z* ?3 Y8 a. Y解题思路
2 x# T9 N% t/ m/ r+ b遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。
# Z; d; [" \, Z! O! G. k9 V6 y% ^
* t/ H: N) z$ t5 q, E; E: L* R1 T7 d) I代码展示
2 r- C1 U4 l: S" x4 D) R
+ t8 m7 o9 @' d$ U( e+ F8 A8 Wclass Solution {
5 ^* `# E6 p& ?/ D9 m: A# N' z   public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
; g& j, e  J8 k6 C5 z- M) V       List<Integer> res = new ArrayList<>();& S3 H! `* @" O% v- r) W: `8 ^
       int last = -1;
. V7 q6 D* a1 D) M4 x       for (int i = 0; i < nums.length; i++) {+ v( ~& u! u  ~
           if (nums[i] == key) {
. U) l4 S" U. I. \6 y" s' B' p8 r               for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {
4 R6 u# _. w4 K) ~& K( M! ]                   res.add(j);" R+ A- s% b5 ?$ `( {
                   last = j;# b' p9 Y7 m9 @3 y1 ?1 |2 b
              }
+ D0 y/ v( [( T* c1 I* A4 L3 P          }
3 h6 v4 k6 I& r/ A+ D) f* i      }- S2 O9 m# `8 Q9 ]) H3 Z5 b
       return res;/ ]+ G) X; W1 a9 l# h7 E, u: U
  }+ H5 C3 C; ?; Z# Z- B, P/ A: s
}
  e, H% P2 @  x7 n$ _  U0 k2 L* O; F8 s  h# a, ]' o8 a

- l0 Q3 X( h% v5 O, k1 d8 p2 [6 Q【 NO.2 统计可以提取的工件】/ `, m2 s9 F5 w$ W

! _4 o5 w. z- _3 Y( g/ P解题思路
. U8 T; y! C+ z6 M* y二维前缀和的典型应用场景。
9 H" }/ E- N, f  P
; x% ?- ]9 c) l) T% k+ x代码展示
5 ^+ T+ B. H( v5 V. k7 s& [
1 a4 j4 r4 V& ~# P2 Hclass Solution {
5 w% z- q; T9 ~) i   public int digArtifacts(int n, int[][] artifacts, int[][] dig) {
4 a4 s; A* u4 |+ y0 v/ `       int[][] map = new int[n][n];2 e0 u/ A8 H# Q5 ?2 V
       for (var p : dig) {
8 m0 p$ z4 L' x( _* |( D/ b           map[p[0]][p[1]] = 1;
' M. V0 D6 m. T1 _' h$ K5 T; Y      }
0 @+ v% V" `5 D5 ]8 s0 m4 e
9 |4 i: O) X4 S4 D* ^       // preSum[i][j] = (0, 0) ~ (i-1, j-1) square. S. ?7 s: C* Y- ?( Z  I1 [
       int[][] preSum = new int[n + 1][n + 1];2 @1 s- Z2 v# d" O. Z( v
       for (int i = 1; i <= n; i++) {/ t$ b( ^; S; z3 @
           for (int j = 1; j <= n; j++) {
& B1 k! }' x- m- R- y6 I6 V* L               preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
( ]& q; o' f  {$ u* F          }
" t9 G7 J( t- i5 U; [      }  A  S+ T( |* Z

+ N5 W1 s3 l0 u* R$ `* C" P       int res = 0;$ s% R7 M! [7 h: s% Q& Z. c
       for (var p : artifacts) {6 B# B  O. \( {7 f
           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]];
" O3 d% M% j  X' D4 X           int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);) Q  [# d* b; ?2 J
           if (sum == real) {4 c# Q9 q# q' Q& w
               res++;* |* T- _6 t0 z: c* S. G
          }
- l) P: m  a& I      }
& T5 n8 i3 r8 U: o% D0 |. P/ M
- v* ?  u; M- G' D4 C       return res;+ j0 ~- G" U# Y
  }; y2 l2 \5 F; D
}/ [6 L5 S( G7 K- _
: h- R; g' [, \) F' W; y) V/ u- l* q/ R

3 N! d( n- q4 q  c( {& O【 NO.3 K 次操作后最大化顶端元素】4 H" q9 D- P* n( `8 [+ e& W" q$ v
1 N+ C# I! ~& x+ A* @* t& Y2 {
解题思路
8 j7 F* v  \- ?* o( ^/ Q! }枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。8 _5 D2 x7 z  u

9 a! K6 U/ `$ _, w; Z代码展示' r) {7 J  p2 e7 ~
/ l: }/ g/ ?$ n! z8 Y+ o. G
class Solution {! P+ Z% R* L  \) V: t# |
   public int maximumTop(int[] nums, int k) {
/ I+ x7 e  \1 T: R* x2 @       int res = -1;
  f9 {8 Q; z7 r! v       for (int i = 0; i < nums.length; i++) {
$ l: e5 f" L- S, y           if (verify(i, k, nums.length)) {
; k% J9 y- F2 O3 w2 d, _! u- J               res = Math.max(res, nums[i]);
) k) N& d7 [# D) p          }- q6 _0 S6 S, H7 Q, z" m( D
      }
$ }7 \: [! o6 V       return res;
) `. d: }) S! }7 q: a$ d# ^: w  }
- u  V+ m" }4 F
$ H+ A( Z; b- y   // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
  c# N! p. W% E0 M, b& s0 f   private boolean verify(int idx, int k, int length) {- j* \1 w9 x0 a
       if (k <= idx) {
! \8 o: w1 r* r5 o* v5 o7 c           return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
  V5 u" F' f4 u3 A1 Z) I      }9 \# |: S( o2 S' L( I2 n
       if (length == 1) {
) t$ F% a4 X& J: G           return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回# v- K& R1 H- ?  T
      }" I) c% ^' s" k
       return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 03 |& A9 h5 J$ a1 ^) H
  }
8 A3 y; }" z; d# X6 P) y}1 _# n, P3 X0 ?5 V( q  U* c

  y/ j9 g, b+ [3 j: ~
% e2 M( O- W0 B$ S. ~【 NO.4 得到要求路径的最小带权子图】
' b2 _% {  z  ]# @8 `: o& q
9 u8 [6 \# d3 a6 |: m+ \解题思路
  r% S0 P5 D0 B3 I# M' R求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。5 w4 a3 B- s; G: m4 d
' \9 Y$ k! b) @, L/ \" d
代码展示/ t* K. p' u& r1 H

" m0 u/ D7 B3 x2 E3 N: d% B" T$ Cclass Solution {% K2 i8 Z) U: L5 m& N
   long res;9 A" u; u8 ~7 V$ x9 R" C
" F  m: D' a/ \1 K9 L2 S
   public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {9 W# U% X. j1 W' C5 m" c9 A
       Dijkstra dijkstra = new Dijkstra(n);5 E, }5 s- r& d1 b$ i+ w! b4 Q
       for (int[] edge : edges) {" B$ L& P% T" t$ l1 D' r" P/ V
           dijkstra.addEdge(edge[0], edge[1], edge[2]);
' D  W4 e0 {" F1 U0 H$ F- t  u4 C      }
! ]1 T. {5 e% h) E2 {- K6 j       long[] src1MinPath = dijkstra.dijkstra(src1);% e9 }. r3 Z, K
       res = Long.MAX_VALUE;
; P1 E5 z4 _; _+ h* R" r; |% |. B* v* j/ P6 q
       boolean[] vis = new boolean[n];; T- X9 Z) m, ?# Y$ N; k
       int[] path = new int[n];  X) d  T% ~2 Q, C& h( E9 E2 y
       vis[src2] = true;8 Z( R4 w* F- n; _! P
       path[0] = src2;; ^* K% c) R. U/ X0 `8 Y
       dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);0 {: j4 X. D3 I5 ]8 x
       return res == Long.MAX_VALUE ? -1 : res;- w+ j- z! ?) L0 }$ w+ e
  }
  v( A/ U: N! f4 i+ n9 U" J9 w, A0 }0 L7 Q1 J. h/ T9 }
   private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {
0 C5 A# c1 I$ Y# w- L( _       if (cur == dest) {7 T) N) f" x$ q; f/ u, [  K
           for (int i = 0; i < pathLen; i++) {: E. B7 H7 h8 W+ H& `+ S
               if (src1MinPath[path[i]] < Long.MAX_VALUE) {
+ |! x, `# R$ j6 Z7 z% d- o                   res = Math.min(res, len + src1MinPath[path[i]]);9 K0 q) n' L2 ?0 y
              }8 H2 b) G, ]1 r: w) ?9 W. J
          }3 v$ C1 x# J, ]9 b; m
           return;& X' A% Z% x% B
      }" [+ |0 |; {1 H! V' a; o0 J7 X
       for (var nxt : graph.get(cur)) {- e4 F, j0 c/ a. s9 N: l' i
           if (vis[nxt.to]) {( \- K; v& F' R) |4 g+ o9 q* e
               continue;8 `% T7 l/ y& P3 G+ X) T8 M* _
          }
, \# d! ?" Y; |! ]2 @+ D! ]' Z           vis[nxt.to] = true;& `  S+ x1 i6 b$ r- ?" H  ]; p* I
           path[pathLen] = nxt.to;
* W0 P  v. H; b- q& ~           dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);
4 W) |; z$ B; _, Y. j& A3 b           vis[nxt.to] = false;" f2 z8 z0 j. H
      }1 x1 [. T5 m' U1 p
  }
- O' c+ l0 C3 q& V0 S$ N5 y; n6 Q) ?  D}
& }( S8 o- q5 ~8 B3 @
3 N: g, u( }, R+ b6 W/ b& sclass Dijkstra {
0 P# Y/ Q9 A0 }2 `  W   static class Node {6 m. x) y8 A1 S- ^4 V0 a$ T
       int to;
) w0 d  ^3 x1 y! z       long len;% Q2 S! T6 V: y, X1 K, g! V

/ g) u+ p( u, Q2 D% W, Y. N) K       Node(int to, long len) {! s1 W0 c9 B& Q9 v
           this.to = to;
2 e" j0 e# s8 g9 W* @1 J+ W           this.len = len;, H0 B, b' {) m
      }: _7 J: p7 O% o- n
  }' u+ u. b  R+ H

4 ?" K% \1 j- E  ?   List<List<Node>> graph;# j2 `) \0 a  ^$ L! Q

) j, A0 I5 }* j9 G   public Dijkstra(int size) {) q- v$ k6 U0 ?4 I
       graph = new ArrayList<>(size);
" \0 b/ i" y4 D) Y/ X, P8 d       for (int i = 0; i < size; i++) {
, w/ L/ H5 \$ f, @, m5 Y           graph.add(new ArrayList<>());$ G9 m4 t& `. J1 {* a3 Y
      }, B( C( k. f7 Y7 }- I! _
  }
  J; B. _1 N! G! ?2 T' G
, l' S  j0 K& W9 _1 D   public void addEdge(int from, int to, long len) {
% [4 C- b5 x( K/ o# e( U3 w7 e. r       graph.get(from).add(new Node(to, len));
$ C+ f* Z2 b# Q2 A) G% T2 s  }
+ _/ Q# S6 }% f
' N7 Q; k# H7 p4 l6 c% R5 e) P   public long[] dijkstra(int start) {
& D, L7 b& h- ^       long[] res = new long[graph.size()];; o8 R+ C/ s% M2 }2 v3 u% N
       Arrays.fill(res, Long.MAX_VALUE);' A) ]6 m( j) a- v/ \
       res[start] = 0;
7 t1 w* z% d. r2 x4 a$ X       PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
  i! ?3 Y# V/ j! N! ^       heap.add(new Node(start, 0));
) {* M8 \( {& H5 q1 v2 R, l5 z2 D7 j( ~       boolean[] visited = new boolean[graph.size()];
6 j: t$ j& Z" [       while (!heap.isEmpty()) {
! \- I5 @: W* Z, z+ _( \           Node node = heap.poll();
" z! V" l# k5 U1 E0 e' k+ E           if (visited[node.to]) {
* ~9 T" C9 k0 @( h               continue;2 K+ I; q) ~& b/ \  ?
          }" A6 {+ M- j8 Y) ~0 A6 q
           visited[node.to] = true;; M' `5 q& l1 E
           for (Node next : graph.get(node.to)) {) x( X8 g+ v9 ]6 J
               if (res[next.to] > node.len + next.len) {! }6 e+ O' n! M1 z' [8 j
                   res[next.to] = node.len + next.len;- j. r& w. q7 A3 o
                   heap.add(new Node(next.to, node.len + next.len));
. R3 L$ R$ |( \% u# T              }
7 F  E, I  O6 f          }* ?- W0 f9 X4 O. y1 X
      }
9 }# f' y  B# k3 S+ J: A( k       return res;3 u4 [- w# V* I
  }
) u+ k% ?6 p$ }9 I}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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