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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】
; c' M9 p' D5 a+ l, ]# o' k% w( p& A: z
解题思路
0 ^% m) T# O/ {3 J签到题。
5 Z0 A7 w) X% j# |
' Q9 c, F" ^* a" \( f代码展示, w& @+ t: J+ D3 \6 n
* @1 ^/ e! S; ~) A9 P) L- |! G" u) R$ c
class Solution {% z5 J0 B. t3 F4 F
   public boolean areNumbersAscending(String s) {
+ F" y0 S' B9 i/ k& u0 {       var strList = s.split(" ");
+ ]  q- |6 G& \0 J0 S4 d       int last = -1;
; R# {5 a9 M3 f$ V4 }, Y& |. Q% v       for (var str : strList) {1 q3 j" B; B- F6 }7 q) j
           try {2 L4 g9 U; @1 B. [
               int num = Integer.parseInt(str);" W( E7 i! R5 [: {0 \
               if (num <= last) {% p9 U! K0 k7 B& m8 Q
                   return false;
) l& ^8 [9 T! t* D: u  g- }              }
! n1 z) U) ^4 m+ F1 J7 B               last = num;
. i3 f+ ^/ D5 K, U          } catch (NumberFormatException ignored) {3 s; `7 W$ A1 x' S- U6 f
          }# ?' p+ d% ?9 A) H1 R
      }& U2 G$ P+ h0 y, ]2 e! K
       return true;4 F$ E5 h5 c$ V0 V& z/ E# B& ~
  }8 y6 B: K+ {2 @1 Y8 y
}
- z9 q* |! _% R; e0 H/ X  b' P! X% u+ r( [4 h! c
+ M( ~6 i9 H- @- {1 E
【 NO.2 简易银行系统】
) m+ a# k/ o! l# D6 y' D
% c6 t$ D6 y& B5 a0 I解题思路# j3 \/ N( F( c$ w( C1 z
约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
2 m' ]1 X6 D9 d# @+ M
: a9 l! J! T( v0 l代码展示3 x0 [$ f  b3 y8 _* c
# R2 f. F( Q8 p: U+ Q
class Bank {1 Q& y& `2 ?! @# P9 W! Z7 ^
   long[] balance;
# Q; R1 ?# I3 N7 A0 X$ E$ d9 r" X   public Bank(long[] balance) {
" P7 j+ \2 a4 N/ [& Q0 P6 l       this.balance = balance;
( ~* M4 E0 Z# V( ^1 G$ k! U  }
. g; Z1 w6 }* u7 Y0 B/ x
8 j, E; E( d/ }0 ?; {) ~0 O0 f; r) o, a   public boolean transfer(int account1, int account2, long money) {" a- X2 V( g7 K7 V# z6 g/ E
       account1--;+ V. Z( c; x% h* m, l* x
       account2--;  w. m. b" V! `2 A  ?
       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {# O/ m0 ~: s; d8 o6 h7 g
           return false;
$ T% L4 w' R( l; e! ~; \* N- m6 j      }4 M: z' j, ~/ \! }
       balance[account1] -= money;4 l: s: [4 Y% M1 U1 [
       balance[account2] += money;4 r' e: r( p" e0 O; x3 c1 Y3 |
       return true;! e) d9 ^0 F% c( A
  }
* d8 t. }$ K. m* S6 ~8 `# ~3 U. W+ t1 l; {' X/ R. N
   public boolean deposit(int account, long money) {
( R! G9 g! d" V1 l3 P  b2 Q       account--;3 Z7 U- @+ h& b8 R
       if (account >= balance.length) {2 S0 b  u8 P5 L  c+ E5 a  Q
           return false;
0 ~) S/ O8 W3 y( b1 g, L/ p      }( c8 Z* ?& N' d# c+ R' U- A
       balance[account] += money;
$ B7 _0 W# W: J' E2 b3 @" G4 U       return true;
7 A$ V" D0 B! W+ z; U# v& @  }
% Z9 c$ A  ]4 ^( _2 k
! \, A' \8 v) J$ T   public boolean withdraw(int account, long money) {" w0 L: F( U7 ^+ G4 Z' L
       account--;
: j) ~3 n: Y5 ^  j5 t0 D/ L  j# ~3 z       if (account >= balance.length || balance[account] < money) {
/ O1 H( d7 z" ]7 b) S% Q1 n  r           return false;% Q+ O. }6 P/ f. J; ?: d5 O1 P9 h1 g
      }
2 Z  r( {$ }, L1 o5 T* H- K       balance[account] -= money;
& z& Y& u% G, Y1 M( N4 [1 R       return true;
$ z5 p* ?7 s- P) V7 i  }% {: G2 g+ w6 s( e" n, @; b# L
}
% Y1 J! G, x- J4 v( k2 x  C3 e* x; W2 ~

  S' h) L+ g2 W! l0 V【 NO.3 统计按位或能得到最大值的子集数目】
( h. [& q) }3 ?7 j: l6 k4 E
% r4 f% A  {6 y3 |3 {, d0 u3 W解题思路! n- @- l) Q: R& B8 y7 G8 M/ k
数据范围很小,枚举所有子集即可。
0 k) F( L, P8 J1 t  {
$ p  R1 k- X& P7 ?% h" y代码展示4 X- s6 V3 c  ?& N" C9 l1 k
# p) W* F, u: g
class Solution {
* t. B2 J. h  x% k" C   public int countMaxOrSubsets(int[] nums) {
" u7 y) A: K% p       int max = 0;
$ u6 Z. t4 C2 O* h. D  {* N# l       for (int num : nums) {0 w  B+ p. ^" M0 b. f7 L
           max |= num;+ o3 _* x4 S. j5 B) |. e& ]9 o
      }
  r' s, o  J5 A# d5 E5 q6 n  q( l: D       int res = 0;
( w  |$ r& C1 f/ T. r. O       for (int i = 1; i < (1 << nums.length); i++) {
0 Y4 P+ d) ?  ^5 q           int or = 0;
+ x) |% D# V* q           for (int j = 0; j < nums.length; j++) {+ z, e1 x8 W* {6 k( C3 b6 S
               if (((1 << j) & i) != 0) {
0 Z1 V9 i3 V9 F                   or |= nums[j];
% `2 Z* u+ ~% z7 {! _              }
6 a, F. s3 ]- ~/ ?& {! u  i& u% [  {          }
0 H6 H5 g' n' p% ?# Y( F           res += or == max ? 1 : 0;
- w$ J: o: {0 |! N5 B$ T: U      }
! C. _% s" l2 Q" `: Y8 k       return res;
  d$ h3 q# Y- V# S! \  {  }
$ P) ^, a8 C* `9 X( m2 b}
! `5 O9 u$ i$ M8 c
1 k( q# W2 K: m" y# O' N) \
- T% K- {+ S- |【 NO.4 到达目的地的第二短时间】6 h" X0 |1 I* Z( O8 v

; @# {0 [3 j! W解题思路
7 {# h1 X0 R! n& C7 ~- Z: S1 @
3 s. U) O" B, T& l- m, j9 M* cDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
1 u& ^9 }* p* x; v4 F* I
* J9 X: G) c, ]代码展示
/ b3 a5 f5 x$ O# R2 F9 x& X/ z; z5 }& G7 b3 ^- \5 m$ u
class Solution {
  _3 C1 t" _% M; t) C/ _" p" k; I   static class Node implements Comparable<Node> {/ K0 I9 X- L: F6 P4 z
       int min;/ `; R& @: B; ?0 N* E' U0 y
       int idx;
0 R3 @  R& s" |8 |& g5 [: I1 Q- V2 x* C( O  B0 o3 j! j
       public Node(int min, int idx) {
4 f7 ?$ }8 v) ], v1 v           this.min = min;8 E: {) \. J% }" ~# V! ^
           this.idx = idx;6 n; Y3 W2 S; D: [
      }
8 i  j% E8 I" s$ i
7 w+ k" O+ f% [1 Q- @       @Override
% K2 A0 p; |, z4 q' k       public int compareTo(Node o) {% I' L$ Y7 y( g2 [* q
           return min - o.min;
# |( w- T# T* }! F      }& A  `2 Q, b$ V  y
  }# m% ^+ V9 r1 _5 d" B' \
, N. W# m+ G1 t$ z) L, V& E: Z+ `
   public int secondMinimum(int n, int[][] edges, int time, int change) {/ N3 p' }- S) S. ^1 v9 D' L
       List<List<Integer>> graph = new ArrayList<>();7 E' j* r7 Z5 w8 u+ V/ |4 e: M
       for (int i = 0; i < n; i++) {- L, J' C2 c2 }; n' Y1 h: D
           graph.add(new ArrayList<>());) S! }$ o" s. f; {
      }
" E# I+ `4 B# w/ c/ X( y       for (var e : edges) {
! `: \8 x8 }' _+ j+ e( {           graph.get(e[0] - 1).add(e[1] - 1);
& U3 D: V6 U1 E" L% L& s, t" |0 i( X           graph.get(e[1] - 1).add(e[0] - 1);
' C* w) n' r, |- t' u0 s: ?      }
# ~$ Q: H; l5 K9 B- w- _( \/ P, A1 Q* J- r; o" m
       int result = 0; // 最终答案, T& r( {5 Q; }
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)/ l1 y% _" w( m
       Arrays.fill(min[0], 0x3f3f3f3f);
: f/ J- y: T5 z8 ~5 I" ]' c1 |       Arrays.fill(min[1], 0x3f3f3f3f);
9 B8 l0 K5 x+ s6 p       min[0][0] = 0;
  e2 v" D# W" Z8 W  \- h  [4 X       PriorityQueue<Node> heap = new PriorityQueue<>();
" i0 J  Q0 y* ~4 W1 x       heap.add(new Node(0, 0));( M  A; U, T$ ]! |6 H
       while (!heap.isEmpty()) {4 h0 A) S( Q. j
           Node node = heap.poll();
/ V- s$ t2 G, ~9 O& i4 W           if (min[1][node.idx] < node.min) {
7 j" `4 u* T8 m# V% r& d/ P               continue;
; O6 e, x  C+ q* [) {! K* Z          }
- {& v! H- s: B4 a& r           for (int nxt : graph.get(node.idx)) {" }: _9 ~2 U' U# _5 S( O
               int nxtMin = node.min + time;9 ~6 m, c" k! L2 B  E+ @! O
               nxtMin += waitRedLight(nxtMin, change);7 [& Y9 W! X/ M" c
               if (nxtMin < min[0][nxt]) {4 l4 t( n% T3 X8 I4 A3 ~
                   int tmp = nxtMin;7 H! p# _. {: K) ~% i" K+ \7 ^- L7 {
                   nxtMin = min[0][nxt];! ~# t# v. e0 p
                   min[0][nxt] = tmp;$ Z( j0 |* M$ a) S$ K4 H( O
                   heap.add(new Node(min[0][nxt], nxt));
" u. E5 G! D: m% ]3 i: u, C( Y              }
8 z1 G, l! u2 V8 y. L               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
# W$ T2 C2 I" f                   if (nxt == n - 1) {
6 t- q2 a2 B* C  E& o9 [                       result = node.min + time;
& `# K. M& E- n% G                  }, c2 C+ L# s7 m6 L9 S
                   min[1][nxt] = nxtMin;
. @1 X* f9 J+ P* Y                   heap.add(new Node(min[1][nxt], nxt));: _6 y7 L# H  R
              }
. c5 L9 J+ H' E  L- e9 V0 d' d- {          }: A8 u3 N  }( N$ W
      }: T) K9 b3 t/ \" h; Y0 s
       return result;
  v& Z. W5 {# V8 U3 ?- d' D3 p  }
4 M0 w- o  _" O; |: N8 r
& q6 ]2 j( w8 `   private int waitRedLight(int now, int change) {
% r! `, o5 i( }# e) F- z       if ((now / change) % 2 == 0) {
+ u, @1 ?  |1 W1 m% \           return 0;
$ M7 }  i' p% b* K4 E5 T8 I      }
& [- z( V: ]$ Q# Z       return change - (now % change);9 k& {* B- P7 L7 b1 X% s: n0 G
  }
3 T0 Z2 ?% x- e}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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