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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】* O1 X' R  p! H* s  x+ z- x5 Q* o

" w# b# o1 y) l$ @% I1 J解题思路
" g5 ~$ t/ H* H$ Q签到题。/ `8 B% p9 H. S  I$ k
0 j& p2 W2 p( G- I! m8 G
代码展示  r4 F0 S4 T9 G2 Q. p/ k

" e/ f+ V6 \6 f) \( N  [class Solution {
( [+ a0 V. ?6 j& F1 p   public boolean areNumbersAscending(String s) {2 v0 Z- Y% X% J
       var strList = s.split(" ");
! g6 J- j* z2 I* H+ N       int last = -1;% i1 ~4 O% \5 O) E* Q
       for (var str : strList) {
. M9 p: \9 X6 s' M" u: Q) _           try {
: e0 `% T& i* b% M/ I  F. r" X               int num = Integer.parseInt(str);
4 [$ n- ^0 s$ K7 u               if (num <= last) {
6 h6 Z+ `/ S7 Z# V* v& `& Y                   return false;
6 T8 i6 `+ T* v  y              }$ L, Z' q! W3 n+ a$ E+ g1 ?
               last = num;
. K) h+ t3 x$ ?6 H  e8 U, o  M$ g          } catch (NumberFormatException ignored) {
9 w! c' F( Z- A* J# b% c          }
: G' q. y0 S1 t      }) n% W7 s; b3 J; k
       return true;
8 J) I$ U: \* z7 B/ s, [- p1 b  }$ N# H' F2 M$ `) \
}
2 q& Y$ o$ v- z0 s5 e! x$ N$ a$ A* j+ ]

: h8 f6 b: Y3 E0 f% q【 NO.2 简易银行系统】( W* ?& y' k3 O+ ~; h% n

1 _, X/ r0 g; X# u- P解题思路- s+ Q3 g( ]$ W4 O! `1 }  d
约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
% X) Q2 ]2 o/ Z: u- K* d7 E% h3 Q
代码展示
  T2 `' r' _6 ^2 ]3 p9 x
. m, Q$ |8 R3 M! E: ^9 E* P2 h; ?class Bank {
) x  R# `2 _# Q; }- d$ D4 F   long[] balance;' O* R) j2 r8 f. p% Z# l4 G
   public Bank(long[] balance) {, C4 U2 a0 e) S
       this.balance = balance;
7 q. C# p* G! v4 p  }. e& D2 F# A& h9 a

4 Y- A1 N  V/ s# C   public boolean transfer(int account1, int account2, long money) {# J9 o/ F6 f/ H/ w
       account1--;
' f  ]' ]: D; ~$ _6 w! X9 f       account2--;  b2 m) Q& ^7 w+ I
       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
( g. D' i- n, C3 \" X! d/ w           return false;
, I2 ]6 P6 m- d: o% @8 ?: a      }' I& s2 m  b1 Q' Q; @
       balance[account1] -= money;
% l  {3 q3 S$ F! g5 y7 w- D& Q       balance[account2] += money;0 ?% N1 D4 O0 N$ c0 w
       return true;
  `# @/ P6 P- a. ?/ O( V" A4 L  }/ _- T2 w# O8 V7 K

& c% T+ ], ~/ w! |3 [   public boolean deposit(int account, long money) {
- ?. }  r5 n- A6 M. s       account--;5 ~- X4 K: d4 ?7 L4 P5 x, O) L
       if (account >= balance.length) {
6 @; M' @7 k$ {. C! C           return false;
4 \# ]9 q& }* X* H$ V      }
- q7 ^' j1 a! u! G) d; r. _" D       balance[account] += money;
  e& [( q2 e/ E       return true;
5 F- Y4 B& G& d& q) I  ?' s4 O6 `  }: l8 {& Q9 B! Q. I1 P

% W* s- q- r5 _0 ~   public boolean withdraw(int account, long money) {8 Q1 s' `  R& m9 A' @( I
       account--;- [7 V' b+ o8 D0 J5 `3 n) {4 d1 @
       if (account >= balance.length || balance[account] < money) {0 ?- y7 F- o% {/ b  @+ S4 {1 |
           return false;
8 Y% ^* ]9 R3 I& E1 A      }
) c7 e* R5 d2 z. {8 a# |9 J7 j1 C       balance[account] -= money;% `- z. O: p6 s
       return true;8 `: I; _  H) g. ?% S5 S
  }5 q6 a( J) H9 l4 L" F4 _" O
}
% @; t# j% t. I4 q$ G- m9 z' Q
9 `4 D7 m) S6 u; x' ?6 S. t: z) f, t& Y
【 NO.3 统计按位或能得到最大值的子集数目】
/ q# |7 S2 k% w# q, X
3 t6 ^- ?' V4 b/ J* \. v$ H解题思路; u; u8 z' ~1 N3 O( `
数据范围很小,枚举所有子集即可。/ c8 r5 I8 R# c9 i- `8 Z
* S  M, i+ f" E) ~1 L
代码展示0 P( ?' l" o4 k8 y9 I' L
9 |0 G0 s0 ~. `2 R4 o4 |
class Solution {
' ^" ?- p% O9 ^! w0 _, O   public int countMaxOrSubsets(int[] nums) {+ K2 R7 M% O+ @
       int max = 0;
, E5 ?) l0 S4 y6 S% }# J6 S/ w) H9 e       for (int num : nums) {2 j0 P- A$ g3 h7 W( F% n8 v& A
           max |= num;
* X: M' U' n# D) z, u  C      }3 |& n+ y. L; p3 r
       int res = 0;
: j8 L- c( [! m+ j       for (int i = 1; i < (1 << nums.length); i++) {
7 k  F8 c- m0 t+ W+ G0 ~$ i           int or = 0;
2 B; J% M5 _1 h4 A9 W- c: g% k           for (int j = 0; j < nums.length; j++) {; P( u: P" W, @
               if (((1 << j) & i) != 0) {3 P7 p, C3 I  \
                   or |= nums[j];
$ q' Z) L$ R5 n1 |  z              }
7 ~7 ^4 }+ q0 ~* O" e          }
& J% x, |9 D8 t8 @& I: S* c* J           res += or == max ? 1 : 0;( e( @! S% x" i, H5 z9 s
      }2 a4 B& w( C9 B) V6 E0 z% D
       return res;
/ W7 q: I5 M8 Z* U  }
2 P& s& t6 b0 n6 V}
! y5 T& j2 H. I, ~6 {; f
) }0 r- Y; b1 ^& q; c9 u6 ?5 Z
2 k, ^) g6 @7 C" R( W【 NO.4 到达目的地的第二短时间】6 h$ Z" u; Y2 N/ u- k

6 T: W' f% V, {7 C- B解题思路
+ C. V7 F0 T" Y# p1 Z
1 f: @# |% ?, H( ]. BDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。( ]: m# \* k1 V9 J

$ ]% h& T( n# j代码展示
' I2 \& K4 C: l9 d  d( C7 C6 Z, s9 K9 Y) n: F
class Solution {
4 T1 s( J# o' }( y3 H0 i' S   static class Node implements Comparable<Node> {9 S- n  b+ g' U2 o7 P- J6 o4 ]
       int min;
  d5 }3 ?& q) K' c% \: @. U       int idx;
  X7 U9 Z6 W% @3 L4 `& h2 e
( i9 p/ ]( ~, J; w! n       public Node(int min, int idx) {* N, r9 Z3 S+ h% i
           this.min = min;+ I: x9 w  A% Y; P: l4 v1 Z8 ^
           this.idx = idx;
/ E* p; J- `9 c/ S      }
% d% U, e+ @& u$ G, j+ J# m  g
( b5 w: Y+ p2 R/ q       @Override
+ j6 V3 i$ M0 j. u       public int compareTo(Node o) {
$ Z( \* @# J& L1 L9 ]" O- u( X- M           return min - o.min;
/ i. e" a* C7 b( ^+ I" L      }; `  s1 u  r, B2 [
  }
7 h& _, p9 F0 u' i' }
$ o& i5 L4 z7 Z. P- J- T9 [   public int secondMinimum(int n, int[][] edges, int time, int change) {
; Y) _8 N2 P) U% E5 ^8 ~6 }5 p! `       List<List<Integer>> graph = new ArrayList<>();6 C  W6 I# d1 B# J3 X9 \
       for (int i = 0; i < n; i++) {0 `# f3 W" E( h
           graph.add(new ArrayList<>());
7 z' z; @) x. u$ D# [      }4 J* o/ D! b4 A- s) v+ O- u
       for (var e : edges) {" Z6 T& P' T" W7 }
           graph.get(e[0] - 1).add(e[1] - 1);
$ e+ J3 n9 s% j* L# u) E5 l2 X           graph.get(e[1] - 1).add(e[0] - 1);  @: x7 \" f) p9 R  q, w3 f: k9 ?
      }
% H( {5 q5 L8 g
+ u. l" P  u: m( ^, h8 f7 ?+ q- ?       int result = 0; // 最终答案9 l5 ^- [1 m; e+ e) a& @# H4 q
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)% z) B0 p' g: M
       Arrays.fill(min[0], 0x3f3f3f3f);" p0 G8 U1 `* H, ?: c4 q8 x
       Arrays.fill(min[1], 0x3f3f3f3f);
5 W( x: P4 N) G/ h       min[0][0] = 0;
1 F: u2 L5 U" h6 }) D1 C       PriorityQueue<Node> heap = new PriorityQueue<>();* a/ }8 a- T! M3 c
       heap.add(new Node(0, 0));" d/ _3 |- E5 q9 Q2 f% `3 q
       while (!heap.isEmpty()) {
( B' X/ q: d8 n6 F5 k7 r" ^           Node node = heap.poll();
3 \/ T" L+ k) F. Y1 x           if (min[1][node.idx] < node.min) {
3 {$ f, z0 a& {; v8 y$ x& t               continue;* r/ D. G: Q2 P5 _& v! p7 |
          }8 ]/ K0 V8 t  H8 P7 y
           for (int nxt : graph.get(node.idx)) {& U9 r( O& D* U, k6 n! F
               int nxtMin = node.min + time;$ y1 a/ O, A  \6 u8 Y5 U3 q
               nxtMin += waitRedLight(nxtMin, change);& ^7 E! X! _' s' s. ?
               if (nxtMin < min[0][nxt]) {
/ @/ W  S. {  l! ?& P$ x& y+ D7 s                   int tmp = nxtMin;
9 Z5 Z7 D; i6 s) |                   nxtMin = min[0][nxt];9 S2 @, B0 z9 B0 ?8 B( B* q2 c  D) l# u
                   min[0][nxt] = tmp;
0 O1 r) |( g+ H" i4 X9 J+ x9 F                   heap.add(new Node(min[0][nxt], nxt));  a& |% x! s3 b
              }, @, g% g4 k! e/ `; G. r
               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
, h% k8 T& l: S; N4 m# _                   if (nxt == n - 1) {
! I5 r+ @4 D  d6 \( w9 m                       result = node.min + time;
+ c+ F; ^' m* _/ V, v, r                  }9 J. G3 h" T" V1 r1 y/ @7 c2 `' K
                   min[1][nxt] = nxtMin;5 x/ n, Y! W& q$ z
                   heap.add(new Node(min[1][nxt], nxt));& k8 S  L9 F% j% S7 a
              }. Q, e: Z# Z7 d; Z4 p# w
          }
! Q( g! P0 C% j: N" U) Z9 Z      }
  L" f; A: ]: n( ^$ h3 j* N       return result;& c, m, \8 a  T) f$ K/ D
  }
4 x6 n9 l; i. Y
. g& o1 y4 \0 S1 ~: K0 ~: _% ~   private int waitRedLight(int now, int change) {
' z2 y+ O3 ]7 H3 `( j/ P       if ((now / change) % 2 == 0) {) Q0 a7 P5 T: ~
           return 0;
) a, E9 j' m: j3 t6 E! S      }6 z" Q$ f& M3 `# h1 X/ D0 ]
       return change - (now % change);9 ~: ^1 c7 O, R
  }
1 H5 F5 X0 ~; P6 A2 _}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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