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

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

上岸算法 回复:0 | 查看:2802 | 发表于 2021-10-17 22:32:29 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】" z/ ?- X7 I9 O  d/ E  w' g
( {( Q( p: V' ~$ g, v" {
解题思路4 P% u6 S1 K0 A/ u
签到题。
$ @" i2 l! q0 h" q$ R2 p" \  b( q2 N3 G
代码展示2 K1 Z% V0 _4 b7 f
: }8 A9 a/ [2 e! U* M9 w' w7 b5 m
class Solution {
- I1 N; q' y, N' p' m; z   public boolean areNumbersAscending(String s) {
; o# h0 x' E* _8 l       var strList = s.split(" ");
/ n8 r2 i2 g5 T8 @. f$ k       int last = -1;$ I' e* j! w% a) e* }; a
       for (var str : strList) {
8 D& r8 C6 Z4 a+ n2 I, w6 y           try {4 `' O" ^. D" T, y& u
               int num = Integer.parseInt(str);7 O; v! y9 @8 J, W# I
               if (num <= last) {
: b- y* g0 I7 p+ d                   return false;
& d- Q6 |! Z# m0 x* c- j1 U. ?+ \$ g3 }              }
" h" Z$ \$ t- R4 b% f               last = num;. y7 ]( q1 d  s" a
          } catch (NumberFormatException ignored) {
: q# z; o& K$ b3 E/ X  @          }
# L; J! F: ~# y; n' a) e      }
% w) P8 D1 I1 |9 N8 @+ g* N       return true;+ M+ t$ }) ]$ U' d8 r+ b5 P
  }& |* i* O# ]2 w1 _  Z4 g! q1 c
}4 h) ~8 _5 g1 Q! R& [/ @

2 D3 A. X; r+ b, b
/ L6 e- ]" A; ]8 c【 NO.2 简易银行系统】. E  E- G& w& F2 N0 Q

5 W, l6 s; G) g; d解题思路
1 _/ f5 Y! l$ r7 R( ]8 l约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
8 j+ j% \- r2 y
4 D% }  O, |; R$ ^; O' U代码展示
+ |: ]% w7 w0 q0 v7 Y7 v3 u6 a9 m$ M+ i, v$ S# o
class Bank {
" k3 F7 T3 t7 \8 h, G# h! m/ {' O   long[] balance;0 }6 y" H- b; K# L( z
   public Bank(long[] balance) {/ _) w' f' L" d9 U: J
       this.balance = balance;+ r, M5 U/ Z, A  [' }
  }
0 y0 `+ ]& B0 u- R& {* r/ M- a( x8 @/ k$ y
   public boolean transfer(int account1, int account2, long money) {
) Q. n' e" c8 v7 v9 I       account1--;& ?# K# h: z# X: P$ [
       account2--;9 g+ s+ ~" K, f; j# \' C) h! Q
       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
6 _1 V" d% _2 O& n( E/ o           return false;$ O6 X: O5 m6 u# \0 n7 I3 y* ^
      }
; l9 ?. f. n7 U- s. w       balance[account1] -= money;
) q5 g6 \' U5 w: T/ \2 o       balance[account2] += money;( a" F( t8 Z; M" V. C
       return true;
  @; }. `. O* c7 s  }
1 P8 X  ]# R. E* [  C9 e0 y' B1 T) f9 u
   public boolean deposit(int account, long money) {+ f2 M  O7 t+ N7 W7 j
       account--;4 i# i6 N- x8 G! s! \
       if (account >= balance.length) {; \& R2 }% l  G+ d9 t
           return false;
( r* L6 ]/ m( R; J+ L      }
; i& e! m& V  B       balance[account] += money;
4 g, ]4 i" j7 \1 Z       return true;
  S' i& K; j" G  S  }+ _2 E! U9 {# A# C/ j) H
5 H+ T5 |0 ^; v$ P. q3 H- v
   public boolean withdraw(int account, long money) {, q/ U" l7 H  R% u( h
       account--;3 f; j( ]2 u. {; P6 ^% N
       if (account >= balance.length || balance[account] < money) {
1 [7 i' Z  S6 t( e, [/ H           return false;
% f, |+ F! U* q) O# e3 O: i/ \      }$ `( X* D! a. u( i5 k# v5 R
       balance[account] -= money;) t! E7 D8 D) F' ?
       return true;
/ f) N+ e& i% o0 \7 Y4 M  }- Q- D( A. c$ s- A+ S  [! ~
}
% ?6 y9 P  }- `* p3 Q  I7 B9 w$ {9 M7 E9 f
2 ^7 V3 a3 ^$ z; E8 a# C/ x
【 NO.3 统计按位或能得到最大值的子集数目】. f6 d/ g8 o0 c- ?7 h/ k' A9 K

: D3 Q, d) H  ~0 J, s- z6 C解题思路
+ q, Z+ P" b& U! N6 c0 j数据范围很小,枚举所有子集即可。0 h+ M  l1 P* b# N/ X+ Y% M2 K
: x" L. r* e; u
代码展示* i$ l# M" I, W( r- s# L& Z
& n: p2 y9 W7 e2 T3 M
class Solution {' W& q- x) J  H& o
   public int countMaxOrSubsets(int[] nums) {
. S, @) z' K- b2 n0 D7 e- q3 c       int max = 0;8 w% A: S7 t0 e
       for (int num : nums) {0 g- Y* M8 ~. x# r
           max |= num;
7 X( D' |- m8 w7 j, B: k( n      }( ]9 Z: x+ O" R
       int res = 0;5 a3 m9 w, I$ w+ H, A. Y
       for (int i = 1; i < (1 << nums.length); i++) {9 M& ]0 e% X# f% h9 {
           int or = 0;" g; S" K+ n, o5 z
           for (int j = 0; j < nums.length; j++) {! {$ i' D7 g. @; q" [8 f0 W
               if (((1 << j) & i) != 0) {
0 K3 F; a/ g9 \1 C) m                   or |= nums[j];
& Y8 g9 T/ q  J9 p) F9 e              }
! N3 [+ E, {/ f: \          }, _6 f. y! s7 i1 y  R6 O
           res += or == max ? 1 : 0;
, N8 J0 ?, H2 x      }) @6 d% M4 T! F# x& `7 o
       return res;! D- b  @3 P$ ]; d" X, z
  }
! f1 g4 M& d' [3 E) _9 a3 u0 k}" m7 F( d" {0 F1 B# N
7 d& k; O" a+ e! ?5 H
0 V7 b1 V  d4 F( o- n
【 NO.4 到达目的地的第二短时间】; f( L1 b$ ~' k( v# Z

7 G2 F- y1 h' @* x2 |4 |解题思路
( W+ p! b1 Y- R+ {, o
7 j3 H+ @8 C' w+ c) f* \Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
- p, ?5 j1 Z1 W6 Q
) v4 `1 ~6 L3 P9 E4 u( |4 F代码展示) d" a- D$ r/ t9 @% l1 i) }

9 b4 D- y% G5 F$ K9 Qclass Solution {0 r( v  f* I% k. G: _  y
   static class Node implements Comparable<Node> {
, W, _! v" @2 {: x       int min;7 k7 z1 N+ N# D- X. V
       int idx;
2 {8 s- b0 X; X2 P, c
, {- e( \" I  ]: k$ p6 m       public Node(int min, int idx) {9 t4 T4 t% ~( d  Q
           this.min = min;* P6 A2 _6 A; j# R
           this.idx = idx;
; _+ Q; ?9 T5 y8 y/ E$ F      }
3 r2 j! Q$ ], ]6 F/ l0 g$ D2 p
7 M3 `8 o) S" g5 h       @Override" k; X8 x) t7 _* Q  {7 \) W( E
       public int compareTo(Node o) {8 U+ f7 K7 Q4 ~7 V5 x: g$ _; ~
           return min - o.min;
% z" R5 q, R% u$ M1 U) P) u0 P4 D      }* d! A. L1 F1 k% R, n0 B
  }! w4 p2 U' x! _, f8 W
, T3 l( A( b) Z. _: {
   public int secondMinimum(int n, int[][] edges, int time, int change) {
7 b( c$ v. X" c, ^7 u- E6 j       List<List<Integer>> graph = new ArrayList<>();3 }* P% `' w# n' [
       for (int i = 0; i < n; i++) {0 N6 K! G# f  o5 R3 n
           graph.add(new ArrayList<>());
  j, n/ c  G. N6 ~# Y      }& U" Z6 J# m. ?( c: d# H- r8 v- T
       for (var e : edges) {
6 O" Z% K' s- J! h' n           graph.get(e[0] - 1).add(e[1] - 1);
3 |& [6 T& E  l9 m# U- Y           graph.get(e[1] - 1).add(e[0] - 1);
1 a+ H% k, ^! a0 p) S6 ?      }
2 {# n. P+ b* n5 l3 \. h6 `% h! b
1 z% a- B6 G3 l! `3 L       int result = 0; // 最终答案3 D: W9 E/ ~3 Z! e+ ~5 k1 w
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)
/ b9 G# `4 z! a4 ?; j' |       Arrays.fill(min[0], 0x3f3f3f3f);6 h3 W& q$ G5 w! X1 M# F3 ]
       Arrays.fill(min[1], 0x3f3f3f3f);) y1 L& b/ a& ?  D/ R1 B0 y
       min[0][0] = 0;( c, j; R/ u; e6 c2 ]0 u4 U5 b
       PriorityQueue<Node> heap = new PriorityQueue<>();: @) v) G; D7 X$ j0 f3 f( G, h
       heap.add(new Node(0, 0));
, c$ b6 o1 n. r/ ^9 T3 ]9 j       while (!heap.isEmpty()) {
' j* G) ]. b5 |2 d8 D8 j           Node node = heap.poll();4 |  p* q2 ]/ K9 Y8 G" r
           if (min[1][node.idx] < node.min) {0 l# i8 W: y6 j& _( |# s
               continue;/ C. E3 D. ^9 f6 e
          }
/ V/ r' F3 _/ A+ ?  {' z           for (int nxt : graph.get(node.idx)) {5 b- R7 c$ u* r+ k5 D: j4 r6 j
               int nxtMin = node.min + time;6 c: w8 {+ N  `- o  g9 ^
               nxtMin += waitRedLight(nxtMin, change);
# l. M2 |! J" h- i. |               if (nxtMin < min[0][nxt]) {
" L2 J. {4 ]8 u- Q                   int tmp = nxtMin;
( {& h0 p( I+ N1 a4 Q/ i( y                   nxtMin = min[0][nxt];8 B/ l0 x) p1 b5 _
                   min[0][nxt] = tmp;! ?/ Q5 t9 S' z0 b
                   heap.add(new Node(min[0][nxt], nxt));
2 w- x& l2 R3 |5 ^0 y# e9 }              }
$ D& A" W+ ~: j' i9 G; p: r               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {) D& {& k& A9 A3 z
                   if (nxt == n - 1) {
0 @9 d4 t$ A& k* K                       result = node.min + time;3 G4 _% [/ l6 U, I) \- u
                  }# p- n( L  d4 N, g8 K/ |
                   min[1][nxt] = nxtMin;; b# ]+ ]$ u: @8 z; u9 S
                   heap.add(new Node(min[1][nxt], nxt));8 u1 k5 O( y" h1 F  z% t  Z# M. ]
              }
" k+ \) ]2 c. X# }          }0 t$ S' H1 S4 }
      }
7 U8 t# O; @, R3 G       return result;
' d( j& a6 ~2 p  }
- G4 {/ [3 v. p# P
0 D6 }! f/ ]0 d4 ^7 J, I( D   private int waitRedLight(int now, int change) {
5 P0 g. Z4 B: U0 B* u+ x6 z1 z       if ((now / change) % 2 == 0) {6 ]/ n: D) c* V+ o, I
           return 0;% D4 i  r4 I; L1 \5 b% h" Z. p, [# x
      }! K9 B7 n: p* c) N- g' V
       return change - (now % change);
9 _! B( k9 m0 P" k  }! @* y& ~  g( _/ B
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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