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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】- X8 m8 F" |% j8 {

$ ^/ H; j; E4 u1 O) r解题思路. L( n7 j6 P( `8 }2 h" A
签到题。
% C- \. Q3 u# q6 I
2 k. h6 ]6 F, M5 h; e代码展示+ C3 }  w: P& e% {

9 g) J; u9 R  g* t( g; B9 {. B% Cclass Solution {
- z2 u/ o# A  r* F1 X/ d   public boolean areNumbersAscending(String s) {4 b1 O4 \) O% d6 p, S8 j
       var strList = s.split(" ");
- [4 d6 y9 r: t2 t       int last = -1;0 I& ~4 c( @0 l
       for (var str : strList) {
% d1 N$ c% ~$ ]5 z           try {+ [8 s3 i) o$ |6 T% \' E) v, n2 c, I
               int num = Integer.parseInt(str);
/ G0 C+ M. B( }; a9 r               if (num <= last) {
5 D  p1 M$ {  V0 X5 f                   return false;
) |5 j* j0 U* c5 ?6 ~! J* ]4 R              }
& W3 @  ]4 U; g3 Z) w               last = num;" R) f9 L+ m; A- _6 \2 d# @
          } catch (NumberFormatException ignored) {4 @- d# f- G2 K1 H+ l" y; V
          }* W; Q* k: Y+ t) e  x8 k" x. k- {
      }
/ e; M' p1 K, I. U       return true;
* h3 q$ }9 l  _/ H0 F& M- Z  }
. ^! g: N: x/ f6 Z$ r& D}' \0 w% ^3 X# U1 Z% \. [0 ~
8 o" a+ d: Q) @  R

2 p: ~& n  c9 g. i+ d$ L【 NO.2 简易银行系统】
; Q7 A) T3 D5 }1 M+ P3 N7 ^% a- u8 o
- a5 v& k" ~, R0 a# i# n9 E* J解题思路
4 L$ M. {8 i% k- K' O约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。/ a4 Q! [" J' a% x

! T- @! q! x, W) A1 u% w* C代码展示
4 `! [1 v: B0 M1 y
& f# a' C! `/ L; T/ Lclass Bank {! H& L  t- B6 ]+ Y
   long[] balance;0 a  Q/ v8 o% o7 @5 F
   public Bank(long[] balance) {# F' q% T1 \. w+ J, [
       this.balance = balance;
. }& A" D: g+ g3 i. v  }
6 F  K0 {" {0 v" T( l0 M% ^) `$ ?/ m% c4 `
   public boolean transfer(int account1, int account2, long money) {
: p5 [( s2 y! G6 C( ]. l       account1--;
/ x: k; a; ~- ?) G       account2--;& y6 e: D0 A4 s8 u
       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
$ c* d, b4 S" m& m           return false;% I5 {5 [" B& z4 [% s. W6 \" `
      }
/ Y! E  H( [4 _5 D% u       balance[account1] -= money;& `( S( D! U) n" n! N
       balance[account2] += money;
; v8 u0 Q0 v% }+ B& K1 a       return true;
  q' _5 I# F6 i6 ?2 Z# C3 F  }! v3 G& ~6 Y0 a+ ]& N3 V7 \. c+ g5 u" `

! @8 C; u2 ?, O' ]; u2 b9 k: p# g, o   public boolean deposit(int account, long money) {
2 [( y* W: s3 `) A' e" J# h# t1 {       account--;
4 o* ~: k" I3 [       if (account >= balance.length) {0 u6 g) W3 ?" |& c, E
           return false;) `% x# f2 ~$ Z; z# p7 ~+ z
      }
- x  |! {* ?; l1 [; a+ d2 b& }9 r7 {       balance[account] += money;
% K. i/ w- o8 R- G" Z# ?       return true;
; ?  ~  i2 u' Y7 O* K; s  }4 |8 U# A4 x1 I) p/ P. ?! n

; ^1 a; V  `7 P, R0 I* V5 C0 E, \   public boolean withdraw(int account, long money) {
1 t, E7 ?1 ~% ^$ y7 g       account--;
" i- d3 t2 q7 h! j2 t, L7 E# Z) ^/ i       if (account >= balance.length || balance[account] < money) {
7 d8 S$ {+ w9 [3 A" u) {           return false;, d9 [8 E2 ^. N: l/ q
      }
0 ?5 p% U. g. G& n! V' q       balance[account] -= money;/ |- u" s& k. }2 K9 E
       return true;
' l/ _4 B0 q8 S6 o! F3 e  }5 W8 a: r5 i# Y3 f
}
- P- `& C9 \  M* R5 o3 ~4 b. i4 I7 l; k; H: u

* u: Y2 W. D& j, e) B5 ?3 _& y' M  S【 NO.3 统计按位或能得到最大值的子集数目】: o/ M. h9 z* b2 N9 p
! E) |6 i8 g9 l: E, t* n
解题思路8 d2 r0 d6 N: ~3 a
数据范围很小,枚举所有子集即可。) n7 i! q: F" V

) |+ Q9 M; Q' h5 o代码展示! p# @# U8 K1 E  V5 s  w9 D8 f& l5 V

2 R9 D- [) b+ Z2 w! bclass Solution {
7 x- B9 A. ]' ~3 A: e. \   public int countMaxOrSubsets(int[] nums) {
1 V& Z& r/ i  Z6 @' W       int max = 0;
' L8 t. F& B, @3 u       for (int num : nums) {5 z& O( b5 W( g5 h- w
           max |= num;0 ~# T6 n+ ?& W4 l/ z
      }& \1 D# M7 c# S2 P& Z/ h
       int res = 0;
7 U, W$ O/ S0 A1 v/ I$ E       for (int i = 1; i < (1 << nums.length); i++) {
1 w8 v$ S0 g, G+ \# U+ t# a           int or = 0;4 k3 l0 d; m9 i( m' }" l% N
           for (int j = 0; j < nums.length; j++) {) n3 S) E0 h5 i2 I6 o& J
               if (((1 << j) & i) != 0) {
$ {+ W0 C8 T- t; q+ B7 D/ B                   or |= nums[j];  }' R  A- T& f; k$ e1 w
              }6 k. m3 Y- W. c1 d
          }' C$ r9 j, B6 T' u# y6 @, {
           res += or == max ? 1 : 0;
( s9 s8 [6 o5 @0 c: `( x' s      }0 n* t, P0 ~& @7 I
       return res;- M' k; j5 ~6 Z; y0 n. Z
  }4 W8 q0 f0 Z! y8 _0 Y) j7 R' I( P
}
1 Z( m+ S" ~9 k: u4 p/ W8 y
! c; ]' O. z5 s  Y
8 ?) z4 [9 z' D% m$ {% ^8 F# c【 NO.4 到达目的地的第二短时间】
* O/ I; P4 b5 ^4 H' |/ I9 P7 y! C4 }8 q* C1 c% O3 |
解题思路, o' E& c. O, z
: t& N9 R' y4 n, w( |3 b
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
7 _6 ^4 z1 g) _; d6 c% T7 P) P& ~2 B
代码展示
2 y* H7 d3 c8 n9 T3 ?
3 ^9 n2 T) Z- o2 W/ Kclass Solution {
) e. D# Q: @4 Z% `4 S   static class Node implements Comparable<Node> {  |( `, u2 t4 h
       int min;; _- d7 L( c* Y& r5 n
       int idx;
; p( E) s' p; @; G" a2 ~
) g3 L3 O. L1 d! B. k# ?! z1 w       public Node(int min, int idx) {
  P; q- Y! E7 ^/ H6 a* c+ |: I           this.min = min;
, M% L2 e7 e3 S) q1 o; F; r           this.idx = idx;* D) i$ p2 C! y1 c: `, l
      }. c+ w* E. S9 f) h+ Y. e0 T
5 ^" K4 @' R6 e" I+ M
       @Override5 N; s1 T) j! j; l0 I5 [" e4 ^
       public int compareTo(Node o) {/ q$ D/ |, n5 k0 B
           return min - o.min;
9 `9 x! {% o' `  a5 I' K- Q% m  d; {; v, q      }/ K: t7 x' u! W$ d9 i- ]
  }$ u+ F& t" M; \( P" V

' x0 n: X6 o  h. `8 I! C6 @   public int secondMinimum(int n, int[][] edges, int time, int change) {
. A. Z+ I) P: J: F4 F# I       List<List<Integer>> graph = new ArrayList<>();3 a8 j0 `7 r) F2 I/ n
       for (int i = 0; i < n; i++) {$ l8 Y3 M7 D! b+ {- r
           graph.add(new ArrayList<>());
; j$ D! E4 m0 O8 J( w, c      }% J5 x1 O+ H" |/ N- V! l
       for (var e : edges) {  I- g/ s+ m" G! H9 X& `' i: Z
           graph.get(e[0] - 1).add(e[1] - 1);
5 w# \9 w0 Z+ @, a           graph.get(e[1] - 1).add(e[0] - 1);7 C2 }3 t0 I( q( O% C0 `: V* n
      }
3 v8 X8 E/ z4 W/ M& Z/ G$ H" E7 g( v7 j
       int result = 0; // 最终答案0 j  r& ^  _# i
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)
, B" H) M) b8 Q( v! c+ Y% m       Arrays.fill(min[0], 0x3f3f3f3f);  y! E( u/ X, B0 j
       Arrays.fill(min[1], 0x3f3f3f3f);
9 T* t9 }+ }3 G, ^7 C+ M$ {       min[0][0] = 0;
" N2 d* o6 k2 v       PriorityQueue<Node> heap = new PriorityQueue<>();) \8 \. C3 G" e/ H) |
       heap.add(new Node(0, 0));
& N  _6 m0 [% a, k       while (!heap.isEmpty()) {
' e  c4 ]3 g4 j6 c- {           Node node = heap.poll();" `; l; ?! c' g2 R8 \0 a
           if (min[1][node.idx] < node.min) {
7 A- N, S+ _8 q& \, A( H               continue;. N! O( A3 J% z
          }
6 H, a6 Q4 G) J% W) z           for (int nxt : graph.get(node.idx)) {
2 A9 s& F% @# n               int nxtMin = node.min + time;+ {. k) t9 W! n( d$ s
               nxtMin += waitRedLight(nxtMin, change);
  `9 x4 y1 N8 N               if (nxtMin < min[0][nxt]) {
6 C: g, Q/ n+ U+ Y" d# r                   int tmp = nxtMin;
; M4 v, v2 e5 b0 \                   nxtMin = min[0][nxt];- r6 @. \8 _# c
                   min[0][nxt] = tmp;  j- k: l5 I9 ^& `# y4 E# K
                   heap.add(new Node(min[0][nxt], nxt));5 [6 l% E' u* B! c; v
              }
+ j7 j* f3 v, T               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
1 A$ g3 |5 H5 }0 y* s, @                   if (nxt == n - 1) {5 b# ]5 `* c" {0 \8 u
                       result = node.min + time;& y& W3 s' I. D# |+ N3 E
                  }
0 |1 F+ `% F9 ]5 ~                   min[1][nxt] = nxtMin;6 }/ q: Z; m4 A: v  y
                   heap.add(new Node(min[1][nxt], nxt));9 V! ?4 b% ~0 D# {0 q  V
              }
3 a) E6 F( f! O, j          }
$ d$ M- P' l3 K+ S7 G      }  ]# G) x' e3 D( z1 |
       return result;& b* {0 Y0 h2 r
  }2 s4 G. y( y9 r- j  d  G6 b
( D6 @3 }+ ~  \6 g& V5 u, n$ w" ]+ F
   private int waitRedLight(int now, int change) {1 u) e) f! P6 V2 y3 K1 K
       if ((now / change) % 2 == 0) {$ v2 V5 o( P5 V; p3 K
           return 0;( C" H! b3 W8 M' \6 Y7 m3 ?. s
      }
/ R. H$ V$ m% b2 I* G4 p       return change - (now % change);$ _2 _. Y" D  p8 {2 D
  }
- Z. I- T2 U9 k2 O0 u: |}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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