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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】0 X6 Z, V2 N" H

; F$ [2 ^2 z4 H4 ?- u  {+ D解题思路% P" ?% G! T2 z/ [' A1 z
签到题。4 F5 N, A' H- @- i' d8 H
3 |5 O8 G, ~0 X
代码展示( \7 h" u. I% t8 X2 v

' M" w6 i2 ?9 ~class Solution {. h& w" k& U1 @& d+ [: E; K
   public boolean areNumbersAscending(String s) {1 q# ^; E- ^, t
       var strList = s.split(" ");+ r' S( P: a! L' d* l' L$ |
       int last = -1;
/ [6 C/ B4 T% H7 r* l       for (var str : strList) {
, j5 ?) J2 C# A0 w           try {/ W3 C$ |% \" g. E
               int num = Integer.parseInt(str);
, [3 h* v! _, R6 G+ K- S               if (num <= last) {
) t6 J* R7 O8 f" O                   return false;
" w! J1 s% u# j' m- U              }
, _. C! `5 y4 L               last = num;
+ A2 L9 T$ M. |# g9 V2 y1 g  M4 t          } catch (NumberFormatException ignored) {7 F: k6 \! k% H4 G8 M" Y4 x" i
          }9 w2 M4 Q' [! ]8 T
      }
/ ^$ ~3 x$ {% U/ W6 g/ H       return true;8 T; z: R7 ]. D
  }
5 G& E1 p: t: A! Q7 O3 v}- D, t2 q# Z' U3 A! Q3 B0 q4 I( p

* V3 z" C$ o( M* O! e- n6 Q
" _& @; i4 r% {7 Q; i【 NO.2 简易银行系统】
: E/ `% _- H. [- |) I+ ^# S$ C' |! Q. y
解题思路
. N- `0 F5 Y+ J& C约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。* L! g( G' L, H8 U/ a

3 z/ Z$ T# G. E代码展示% i, a" R/ j9 c. V! S

* v5 \# y! Y" M- _# x* R+ l$ Yclass Bank {
2 R6 I/ @% Y5 h- K1 Z   long[] balance;! M' O. T/ H- T5 \
   public Bank(long[] balance) {1 E4 T, i2 L; i* ~3 @/ g
       this.balance = balance;
! z0 H: l6 h% s# z# f  }
2 C  t$ ~% M, a' R  n
) e2 ?* ?' \- _# h# ~  o& ?   public boolean transfer(int account1, int account2, long money) {
$ z8 e3 E" P8 I+ o# z3 |2 L. K5 |       account1--;8 c# y- H) \) ]* D3 B
       account2--;
) q+ D3 ]% ?+ ]8 A: F1 R1 A) K       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {/ H0 Y+ s; h8 P6 D- _3 _4 a- z
           return false;( r$ `: i* Z& P$ H' _
      }
  q# ]3 c' F6 r" J- X       balance[account1] -= money;. A0 B; b- ]; M1 r1 @1 m9 u
       balance[account2] += money;1 l8 b+ X+ y7 q4 t4 K& A
       return true;
: M1 {1 X/ g; |. t7 e( }  }
- G; V& ~6 h5 u+ C. ?: G6 b, Y9 s5 `) Y* b
   public boolean deposit(int account, long money) {
* k5 k- Q! e- y# K9 G/ e: B       account--;( [7 o. [: |5 w& \: ?
       if (account >= balance.length) {
, ^# \0 I" ~. B2 W# L7 x7 |! E. z! M           return false;. ]; j' i$ \8 C& i8 Y3 h5 P  O
      }" {# Z8 f% s$ ]+ E
       balance[account] += money;
+ [! A1 M* G& N: {       return true;5 ?) ?& P3 Y1 A3 g
  }
( K6 i6 o4 D" `# x! ^( \; ^  V* d  V5 k. \
   public boolean withdraw(int account, long money) {6 ~) N+ M3 y/ ?; w# w
       account--;& l1 y- b$ m6 y% M; q/ p
       if (account >= balance.length || balance[account] < money) {
; {: h# c; ^+ S' n/ [2 d           return false;% [, {6 Q5 ]! ^- F$ v! l) _
      }* m7 {2 `1 n6 J% t* M5 f) d
       balance[account] -= money;8 z/ j+ u$ A' g
       return true;3 P$ Q! e: C  k0 M3 q7 V; J+ C
  }
5 _# W5 Y& w5 e; b9 x8 p" N. F5 q}9 k) r# S; s5 Y9 H
' j6 m. x" M- V' `; a* g. ^

- D% Z- C* q$ {9 p; Z【 NO.3 统计按位或能得到最大值的子集数目】  \+ m4 ], M$ K( z) ]1 T

4 @. C0 S0 a* i5 U解题思路
9 n  x0 `  m. m* e( b' }数据范围很小,枚举所有子集即可。4 M7 h' Q9 \. Z, ?% j- d5 Q

5 z0 s  P; Z3 T" k! V& U4 M8 b5 x代码展示
5 ]* B4 D) b4 a8 t, ]1 c  h! }+ r
class Solution {8 \* s& Q2 J' c+ ?# ~0 V" {
   public int countMaxOrSubsets(int[] nums) {
/ G! D, h6 B/ ]) r       int max = 0;
$ J3 @" F. D- b: x. }" C       for (int num : nums) {
3 j7 R4 E- A0 L           max |= num;: L) e. j9 i4 z, j0 Q
      }
. v. ]( s  F/ u1 k1 U5 u0 y       int res = 0;
! [0 s0 I  E9 H$ b: ?       for (int i = 1; i < (1 << nums.length); i++) {1 I5 y  R6 ^* e" ~
           int or = 0;) t) V0 Q0 U1 T' k+ g! r8 T2 [
           for (int j = 0; j < nums.length; j++) {
5 d& _  B1 c! R' R8 _2 [$ m0 z) m               if (((1 << j) & i) != 0) {! f0 k& e. y2 |2 _  g
                   or |= nums[j];
$ V, @  U. f3 A  R7 R8 o              }
; R9 K' L% n% ~+ `; ?          }6 |5 }- w& Y! }
           res += or == max ? 1 : 0;
) C' N" d# S/ g+ k. A0 V/ J      }+ n) S" h7 g" u% G0 g
       return res;
, u; b9 o  e: e. g( O2 v  }, ^- ~: U: ^6 Q( @, V) O
}
6 \3 _5 k* z3 R  j9 F" _" l& |& u+ o" G

$ {' F3 f  a6 b9 ^: [# ?- u【 NO.4 到达目的地的第二短时间】/ s8 K/ z9 B9 ^

% ]$ T% k* }& k0 X解题思路0 Q  A5 |. ]; o0 o7 I* [

' r! u4 _4 j6 t7 BDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
8 O2 ]5 Y% b7 I
( F& w$ U+ N- D; j代码展示5 `# e1 J) R6 M6 `8 f

( `' \1 y6 k& H% j8 vclass Solution {0 W8 U1 y% w# W1 x+ W  W& `; c  d8 R
   static class Node implements Comparable<Node> {
, {+ k3 r( d) {: P, C       int min;
- F. m9 @) R5 t, B, i7 D. o       int idx;
% |7 y$ O1 O+ D
8 B3 A+ U  ?6 m, E# W- o       public Node(int min, int idx) {  E. m, V' d5 P" N2 l# ^
           this.min = min;
& Z8 l+ k. C2 k4 W: Z           this.idx = idx;  @+ s+ {$ s+ w! q! p) s& U% b
      }& Z4 Y0 T% J) \, q

4 N. T3 }0 J3 s5 o+ Z  E$ D       @Override) ]# l2 j0 @' F  @, u6 d
       public int compareTo(Node o) {) ]+ Y! o0 U0 t( ]* h8 d' ]/ O
           return min - o.min;
5 h% {' k& e! \, \. c2 ^' s      }2 S" C! x' A% P1 C
  }; y6 B( X5 o' }; b( V
" [( V# Q, W5 ^( j" S3 c
   public int secondMinimum(int n, int[][] edges, int time, int change) {
! F: ?. m* u+ o. L/ L       List<List<Integer>> graph = new ArrayList<>();
8 h8 J7 j, H2 L7 u& _5 @8 |* a       for (int i = 0; i < n; i++) {% m0 W; h& w: ^; x+ Y/ `
           graph.add(new ArrayList<>());
6 @8 i' p" m1 N7 ~% W5 `      }
1 ^% p4 F* r( r9 ?+ u0 r4 {6 ^  M       for (var e : edges) {9 p$ q6 x' S$ O5 N3 ?
           graph.get(e[0] - 1).add(e[1] - 1);
+ w: C7 \6 z' {           graph.get(e[1] - 1).add(e[0] - 1);! S8 A  E& Z! {. O; ]" z8 F' X3 W) B
      }+ ~9 w2 e! J- K2 N% z( s

% t7 ~& U. |: K2 }       int result = 0; // 最终答案
0 {% x4 N5 M8 E) P) f5 Q' V9 W+ v       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)
; o0 x; Z7 u4 G4 }/ A# u$ g       Arrays.fill(min[0], 0x3f3f3f3f);, X4 ~+ L6 A7 ~# ~7 n
       Arrays.fill(min[1], 0x3f3f3f3f);' ]/ v' t. J- e2 D
       min[0][0] = 0;1 o4 p3 |# ?0 H
       PriorityQueue<Node> heap = new PriorityQueue<>();
- @( i' O( T; o# I6 ?- `% m       heap.add(new Node(0, 0));2 R0 X& B. X! X/ j
       while (!heap.isEmpty()) {8 _! y, z9 D  N
           Node node = heap.poll();
0 m8 G; @* }0 q( T2 c           if (min[1][node.idx] < node.min) {
/ L9 @+ `+ b1 n* M( x5 f$ l               continue;
' w; E6 `6 [# D4 n          }* R2 u- k( t/ U
           for (int nxt : graph.get(node.idx)) {
& s! w( p% j- c, C1 j               int nxtMin = node.min + time;1 e8 X/ P+ J" A) A+ ~
               nxtMin += waitRedLight(nxtMin, change);
7 R' ?6 L* R: m, F               if (nxtMin < min[0][nxt]) {& k2 R. M0 ~  F. |7 y  b( ^- l. ^, _" g- l. r
                   int tmp = nxtMin;
5 ], b3 F1 t5 k3 F                   nxtMin = min[0][nxt];
% ^. F! U  f( r7 Z$ m+ y8 [                   min[0][nxt] = tmp;8 S* @1 ^% I9 [0 H  a
                   heap.add(new Node(min[0][nxt], nxt));
' w2 D( {. q" \1 s( ~& d( F. {. w              }
; R. w* i0 ~4 C% @1 E+ s  r               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
# t) a& G+ n0 ~1 V# S) V5 T6 A                   if (nxt == n - 1) {( q1 w6 f# L1 n: s, D9 U
                       result = node.min + time;
. ]8 s" G0 p5 A- d+ |# Z                  }
/ h  Z- v& [5 j! H                   min[1][nxt] = nxtMin;* X$ U! w. ]4 f/ Y
                   heap.add(new Node(min[1][nxt], nxt));7 O' Q5 a7 B5 o
              }
) \7 ^, I& N( O  M7 t% |/ W9 o          }
, d0 v3 o2 e3 L4 }3 q      }& c/ ?8 `6 H2 v4 {
       return result;) q2 g8 A$ F# S4 L# @) [; W
  }9 K  N; C8 a+ c! [# m9 j# y1 I' n
  I5 z2 ?7 [& v5 T" o- F
   private int waitRedLight(int now, int change) {
# J0 [' |: w4 }; ~% {( p6 R4 K2 U       if ((now / change) % 2 == 0) {
4 i+ x8 [) X+ m% k$ g$ `7 Z- J6 S; Y           return 0;6 Y% k/ Z" x9 |. g
      }
9 P/ H0 o6 m9 m6 q0 u       return change - (now % change);
1 X% i4 L% W# ~  }
  P6 k% K* w  o1 U7 T7 u; @& F}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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