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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组中的所有 K 近邻下标】+ V9 O1 r; Q' t; j5 P# ]8 F4 @
( y! I" i+ z( W
解题思路
0 R7 g1 h+ f, ?1 H  C( E3 l遍历 nums 找到所有 key 的下标,然后将其左右 k 范围内的下标加到答案数组中即可。
8 ~5 a$ j5 ]+ H4 O0 S; |. e1 e8 r& o$ Z* p
代码展示6 U' S3 t3 m1 p4 U
, {" w4 F$ q4 K8 b: q" P1 z1 q4 e
class Solution {5 c7 D: S" y  f$ Y' x( ]
   public List<Integer> findKDistantIndices(int[] nums, int key, int k) {
) z5 X( m  n. k( I       List<Integer> res = new ArrayList<>();4 q% Z' g+ {1 a: w- I+ T5 ?
       int last = -1;$ E9 [7 }$ M9 i) q1 j
       for (int i = 0; i < nums.length; i++) {: c! U0 o: M& i) b; z5 N
           if (nums[i] == key) {0 v2 p% e7 z2 D2 t- R* G
               for (int j = Math.max(last + 1, i - k); j <= i + k && j < nums.length; j++) {% l2 Q, U1 O( A, d
                   res.add(j);2 @: ]4 K  a; G) ^* d( l2 }$ H/ `
                   last = j;
7 D6 a2 q5 J7 W4 D2 G, E              }
1 y) t- W: j' x1 t! S- u  F          }
, M9 G8 ^+ }! x      }
1 o% y9 U# B- h+ ^% l  E       return res;
6 r+ t' z. g7 o  }  d& ]. W! i% c& z$ L
}, U2 l5 H9 E6 I: f

: ]: c: M+ d- i0 b' H  V$ o" _$ S$ V% p, r9 k$ z9 ?
【 NO.2 统计可以提取的工件】) H: z' ~7 h! r1 x% k& x
. a+ W  [7 Q5 F1 a4 U
解题思路
! V& E6 _) X* W+ {+ Y二维前缀和的典型应用场景。$ n( m( C- {# b* D; q, C

: e; ~; [+ r8 j) k5 n+ v代码展示3 b0 W7 n, p/ ~. N& R. X

0 x' s2 |: d! ~( O$ M! hclass Solution {* v+ S* r) A7 O2 \
   public int digArtifacts(int n, int[][] artifacts, int[][] dig) {* p* a. L7 B" O- ]; N! S) t
       int[][] map = new int[n][n];, r* D& b+ x  T$ t. m9 a
       for (var p : dig) {
- A3 U+ ^2 y8 A) ~* }           map[p[0]][p[1]] = 1;
" A* ]% i: G" l: d, ]      }/ ^" o$ r) X# w& T+ w6 z

/ L' @% R* T  m       // preSum[i][j] = (0, 0) ~ (i-1, j-1) square4 ]' @2 L. g: I
       int[][] preSum = new int[n + 1][n + 1];
; r2 ]9 a& H; @: n1 _% f       for (int i = 1; i <= n; i++) {
. o% T1 v; \, I" {* X5 @           for (int j = 1; j <= n; j++) {4 L- i4 i0 B! B/ x8 }$ y
               preSum[i][j] = map[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1];
( O8 |- ?0 c9 h! l- V" k( {          }) h- h1 n  h" C/ E/ b
      }
7 Q6 D1 n' a1 Z- d) Q' _9 ^
% ]7 Z# m$ D( F. z( y       int res = 0;; y7 c/ ^( F) ]% c% R0 q  O) u
       for (var p : artifacts) {
* f/ _9 k( b3 T  s6 l, f% m           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]];( p8 k. i. q% ^4 F3 P  _
           int real = (p[3] - p[1] + 1) * (p[2] - p[0] + 1);
; V: x. c8 a5 ?. t8 P9 K4 m           if (sum == real) {+ m1 |" o& f, m$ }3 h& n* m
               res++;
1 z# i" h1 g1 P& K          }
" n6 D$ x  e! C3 |      }0 @3 E4 ~: E% {+ u3 Q

6 ?+ H' p  F; r: R$ D1 y/ d" E( Q       return res;; h) f, @& }) u0 |
  }
1 P8 B) ?  V7 r& b/ o$ I}$ D- q/ S. g+ v1 R( B/ y" l

/ B- a* k$ m0 C$ K! t2 |8 h) _5 S( u% D$ S9 S0 j5 {
【 NO.3 K 次操作后最大化顶端元素】
+ m+ F. h4 j9 L( v
7 X; O2 w& a+ j; R* W" h: A9 Q解题思路
' ~8 P1 ?' k3 j6 b$ D: a3 i: Y枚举每个位置,判断这个位置经过 k 次操作后能否变成栈顶。详见注释。3 [1 R8 w2 U4 r5 V

/ z% y0 ]; g5 Z) @- k; U9 F2 y代码展示
6 A4 c5 t" W% `4 M. M
# X: p' ?% G1 ?& C( F, m5 m0 cclass Solution {
1 q8 a+ H" E. o; t   public int maximumTop(int[] nums, int k) {3 H, D2 m9 C. v# D. x$ z8 J$ k# c- N
       int res = -1;
* A  }# F. y) B5 ~       for (int i = 0; i < nums.length; i++) {' ~9 W) b) W1 D& v$ S( T+ M! t
           if (verify(i, k, nums.length)) {
" Q' K4 t( @# g9 q; \2 C8 _' }" `' {               res = Math.max(res, nums[i]);
% S! g5 u  y1 F, w3 Y5 Q# W          }
/ R& h. {- u+ k& ^# M* C, l      }
, @/ M( @! ^+ f       return res;* b% D5 ~) v% S1 K$ O- q
  }8 E7 M. C* P6 _" M) K
: C: M  H' u6 `0 Q7 `( R' x
   // 判断 k 次操作后能否使得 idx 位置的元素变成栈顶
; i% v% B, b1 R   private boolean verify(int idx, int k, int length) {. S% f* }. o* y6 r* b4 B  @
       if (k <= idx) {0 ]% V" Y( f, k5 V4 ]: K
           return k == idx; // k < idx 时说明一直弹出也无法使得 idx 达到栈顶;k == idx 时恰好达到栈顶。
4 u; v5 j0 B2 ^2 j2 ^+ M; U. o      }
" L& A7 Z; k7 D, x% I/ Y6 c       if (length == 1) {! k3 i* z& m  T: [& K
           return k % 2 == 0; // 只有一个元素,此时只能弹出、放回、弹出、放回
6 I! E! h' R% p      }/ o! P+ M+ t% M; w
       return k != idx + 1; // 有多个元素,且 k > idx,此时只有在 k == idx + 1 的时候无法做到,因为这时相当于 k == 1 && idx == 07 j% y! `/ Q. P+ m- Q
  }4 O, l! u  t8 O* T- D
}9 u- F5 l7 i  o8 j. d# U3 w

/ g  v/ k# M1 J; v+ I+ \. s" G5 @" E" B; D0 g
【 NO.4 得到要求路径的最小带权子图】) d) @8 p" U- `' f) M( W
# l! l' `! h0 N/ I
解题思路
" M8 T. w2 j6 X, f求出 src1 到其他所有节点的最短路,然后枚举 src2 到 dest 的所有路径,每找到一条路径 X,枚举 src1 到这个路径上每一个点的最短路 Y, 此时 X 和 Y 的长度和就可以作为备选答案。
3 Y) x0 Y1 z6 V: r( i& Z4 T; ~+ d5 j" J0 |4 c
代码展示( z! |" g9 L0 O% S$ a& A% z7 A
9 W3 @: k' i  B" y" O
class Solution {
/ ?: y& E9 A& x# t/ I3 P   long res;7 _) ~* p5 B" a" p, ^! V" n
2 O$ e2 Y6 z& r2 i  L; ~* o7 I. g% @, b7 f
   public long minimumWeight(int n, int[][] edges, int src1, int src2, int dest) {
6 `: J. v6 t2 C4 `3 F: U       Dijkstra dijkstra = new Dijkstra(n);+ w4 g7 R/ W" S$ ?- F! g
       for (int[] edge : edges) {0 N9 ~; T' R0 D( @
           dijkstra.addEdge(edge[0], edge[1], edge[2]);
5 S. n( d' f8 b1 e& ?" N. I      }
0 v( k5 l: u9 i7 `) @' J2 Y       long[] src1MinPath = dijkstra.dijkstra(src1);5 Z4 ]; x% s6 b4 o8 r/ {( k
       res = Long.MAX_VALUE;
* l8 G( V/ j. u: [
9 v+ J5 [* C& E- c/ H$ Q& B       boolean[] vis = new boolean[n];
' ]( |0 V! G0 s4 P- ^$ a. Z       int[] path = new int[n];# C4 w* u/ O* W! U
       vis[src2] = true;
& D+ A! R4 v9 @; e+ K# o  H       path[0] = src2;
* Q/ C) |) q0 h+ U. _( K! d       dfs(src2, dest, dijkstra.graph, src1MinPath, vis, path, 1, 0);7 E& ~, i- `4 b+ ]
       return res == Long.MAX_VALUE ? -1 : res;6 x- @: z6 n: Z) V* j
  }
9 ^5 j  H# F# e$ C" U( j* ~& |
4 m+ M1 p$ f- A$ n   private void dfs(int cur, int dest, List<List<Dijkstra.Node>> graph, long[] src1MinPath, boolean[] vis, int[] path, int pathLen, long len) {% P- U" x4 }: t3 P  {5 [
       if (cur == dest) {- Z- s& Z# \: n7 u" L# z- M
           for (int i = 0; i < pathLen; i++) {
/ M$ S9 S$ Y0 R' Z- u# C9 W/ y               if (src1MinPath[path[i]] < Long.MAX_VALUE) {
7 S" _7 X6 \, B! w                   res = Math.min(res, len + src1MinPath[path[i]]);
/ N# Q7 [. a; c6 y) o7 k. x* ~1 E4 g              }
/ H) d' \$ T5 J: t+ h3 N3 g          }) t: {3 g9 |/ s1 @2 O  v
           return;
) G( H; K0 q- y2 U& l      }, \- Y2 I7 P7 B3 G. j
       for (var nxt : graph.get(cur)) {) X& X# j4 O) Q6 b" ~. E
           if (vis[nxt.to]) {
" e( E! c" i; M" I+ ?, ~+ }5 Q               continue;' Q- l, q/ I. p3 r! [0 Y
          }
8 {& t5 r5 k" Y- ^           vis[nxt.to] = true;) j& N1 S0 W. y, l
           path[pathLen] = nxt.to;* F& {( i  m( u0 l2 Z; s6 h/ ]: C
           dfs(nxt.to, dest, graph, src1MinPath, vis, path, pathLen + 1, len + nxt.len);; P$ h% j, O/ _
           vis[nxt.to] = false;: K* k+ \. U& j4 M  |, v9 q
      }
; X- T8 b2 y2 r/ j. g- J" J- n  }7 ^$ ]: Z# x1 x9 W/ [
}! p& {0 C; g4 F

' M) ^- H: U6 c. uclass Dijkstra {6 h9 g  a5 ?' A/ ~
   static class Node {' h0 N  K/ P" D& U
       int to;
. z- F: m- m" V7 y( j       long len;) i  U- l, p/ n# Z3 q; f
  r) K: `+ N  D% [3 B
       Node(int to, long len) {5 C: H) ~6 J: d1 A& A+ T+ p" c
           this.to = to;' ^) G) I* ~# L1 y- B8 H
           this.len = len;
3 Z7 t. q! ~; ?' x. U      }3 z7 T* b$ e% t
  }+ A1 B* }* g# H- h' T

1 ~& U8 G7 ?& M& o! [0 n% L8 _* ~6 J   List<List<Node>> graph;
7 M) X) r' U, n5 J& |: x6 g1 S/ a: G9 T, w# \5 e8 v
   public Dijkstra(int size) {, R: C5 ]6 v) r- C, V
       graph = new ArrayList<>(size);0 A* U  M6 g* a1 q
       for (int i = 0; i < size; i++) {* r" j7 |7 E  s( V$ X' ?
           graph.add(new ArrayList<>());
; z" F: |3 S" S  X5 n      }
- o# [1 x) r. J. J9 a( ^  }
+ B( w/ R, N) E- V1 G1 n" P  H( C; W. B0 }$ u  [( `6 m
   public void addEdge(int from, int to, long len) {" C9 i7 U+ _) s  |! `: K8 {
       graph.get(from).add(new Node(to, len));
0 }' V& p" a) ]! |9 d# a1 h- w4 s  }2 R. ^9 r4 }" R' F! D6 B3 e2 o% h
$ A+ r5 ?" J4 d5 {- j
   public long[] dijkstra(int start) {
+ |7 u/ M, w# p' N7 t+ r       long[] res = new long[graph.size()];
  e9 T8 g" z% E1 d. |+ ?, l       Arrays.fill(res, Long.MAX_VALUE);  M9 |+ ], G$ Z9 D7 u
       res[start] = 0;
* B: R! a2 F+ j3 Q; w" G. `' e       PriorityQueue<Node> heap = new PriorityQueue<>((o1, o2) -> (int) (o1.len - o2.len));
2 G% a  v- c' ?0 N& L& M       heap.add(new Node(start, 0));
/ \0 x7 v; S8 t6 b7 V! m       boolean[] visited = new boolean[graph.size()];+ P2 v! y$ t9 g; `" x; h3 V! X
       while (!heap.isEmpty()) {
3 Z8 \- l7 f1 }4 i0 i9 ~0 Y) d           Node node = heap.poll();
9 @: e6 b8 k5 {+ u           if (visited[node.to]) {1 ?5 o# |" [2 z* ~* s+ O
               continue;
2 ~$ e; @8 p1 ?: b9 [3 f          }
3 ?. f- N! c3 ^3 x7 h           visited[node.to] = true;
* Q! X  a/ f7 E& j  m' F" l& S           for (Node next : graph.get(node.to)) {! p% F, y+ W4 K& K0 S% N( `' {
               if (res[next.to] > node.len + next.len) {8 R' b3 g9 ^; Z+ t7 o1 X
                   res[next.to] = node.len + next.len;/ M' V; ?* x) p9 L- J, Y& V* m
                   heap.add(new Node(next.to, node.len + next.len));
: I( E9 L8 P6 ]7 k9 D              }% F! h" }6 U& k/ \& d9 q# J- z
          }7 K8 ^! D1 D7 O
      }6 }4 d4 |6 W! X6 {+ V9 h
       return res;/ @# C! ]( F" ]( {: d* h
  }+ [) P2 D1 T9 C3 Y) c9 `" i" x) |
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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