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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】/ G9 F; z; e3 a) G) p. F, N

0 F: m% q# W; b4 s" v解题思路/ [) ~; V9 D0 p5 }& R% {+ f7 U$ r
签到题。0 p, C1 @! B& W4 ^& e$ `6 }# t; E

2 H4 y. c8 |. a代码展示
4 [4 H9 ?8 I6 g2 f$ C0 J7 ^, ]) y
class Solution {# G: s4 V$ w% N8 K" }6 V
   public boolean areNumbersAscending(String s) {; a6 Y1 ?( ]& w; d4 W7 P; K
       var strList = s.split(" ");
1 _' n" J7 K0 t       int last = -1;
. b. \# ^( B" g       for (var str : strList) {# ?) R, J  Z3 t( |$ Y( h
           try {6 W5 y7 f, z8 j# V
               int num = Integer.parseInt(str);
2 }* B) Z- c" k               if (num <= last) {
8 z5 y, V/ Z6 L5 e9 K( H5 V                   return false;7 E1 P) I& M7 s9 L% M8 V& T
              }3 {2 F) m+ `  _  q
               last = num;
; I: T) f7 J9 F5 V          } catch (NumberFormatException ignored) {
/ o1 L9 M0 f6 E0 Z) u" R/ S8 _          }: ~1 ~$ w. B3 p0 o: ~
      }
( ^% I( g) R' a' Q4 H! B       return true;
: ~7 ~! V. U  s, s* G/ V  }* X- D& a0 q% i$ m% }) \( c8 G
}! z" P6 F+ h1 `8 X

" y; f2 D; r0 k) K( Y3 U  h' N5 I& s# v7 a$ T; d
【 NO.2 简易银行系统】! N7 M& v& a" T/ t: l1 y; D/ j

! i/ `* F0 _/ e+ G8 R解题思路
: v& S: \5 W: G+ S2 a" c约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
5 ?4 R, l' e. T1 n  Q! T
% K% a$ |3 M, m. y7 z代码展示; c0 V& Y; f# D6 ^, y

' X/ u5 t! P, ]( I) O$ t0 Y: G: d6 `class Bank {6 n+ \  A5 s1 [& x) [$ k) r4 O
   long[] balance;. [% w. L5 i4 a/ A: D
   public Bank(long[] balance) {# M9 a4 N( l2 n) N$ r5 ?
       this.balance = balance;6 |0 U3 @$ r0 y8 Z) E# x
  }
0 @; _' b' c  w7 [2 C9 u# }3 z7 P
4 B4 `2 R; K' S" s& u   public boolean transfer(int account1, int account2, long money) {1 l% o7 \/ x0 A2 L
       account1--;
! `# T$ g1 K0 v% m" c' Q6 `       account2--;. n& H6 A2 W  G1 i$ l, K
       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {. z  f- u0 d7 i8 Y0 B
           return false;
  G3 X3 I- A* ^9 ?7 m      }3 ]* }" @* E# b' t# a1 L6 a
       balance[account1] -= money;
# a9 X: B$ a' r4 q: z       balance[account2] += money;% V1 x. `* N# e& E" i( G
       return true;  P. Q" m, a6 n4 w5 [7 Q9 C8 @4 O
  }
  k) H: K3 s; v9 R; Z# n( D& v0 Q) R
   public boolean deposit(int account, long money) {+ h! q1 L! t; u3 @* [9 i4 a6 K2 Z
       account--;) l) `7 H0 t: Q: D. V
       if (account >= balance.length) {
' m0 b& Q( d& M           return false;/ G. H4 u4 o* G2 m# }
      }
. p1 ^' H9 p2 G$ h4 i1 U       balance[account] += money;
; R! m6 P: n+ l0 \# O  V       return true;
& P4 [/ `# F. u9 @9 z  }
) F; K; J1 G$ a! V
2 g: d1 [9 k/ [0 K4 l$ p. f4 t   public boolean withdraw(int account, long money) {
2 @1 V4 P, J1 B- L5 l       account--;
. ^% Q! k) M; w/ t       if (account >= balance.length || balance[account] < money) {
: ~# Z' ]9 R" i9 y           return false;8 w9 n+ K$ n8 [
      }
2 Z7 [" c% f" G$ v0 E       balance[account] -= money;# Y  f4 F8 q" g4 Q
       return true;
: f" }0 v0 Z# z+ o1 C/ g  }( u5 z3 U  D/ ^% D& s; ~6 p& R) o
}+ n, u6 n- _% I. w, X

: W% c! ]4 m$ m: }7 {& q) k
- W! p& V7 n% h  H& y【 NO.3 统计按位或能得到最大值的子集数目】. `$ J/ O* P) \8 k$ g

, ^' {2 `! d  y2 }, f解题思路
7 j. W; O# k& k/ I' r( e! @数据范围很小,枚举所有子集即可。
0 h) e  {* q' [/ i, v3 |
) Y+ l8 Q1 r  g代码展示* g7 [7 X& ^7 r$ {4 b2 q3 w0 Z" K

3 ^% o5 Y4 _3 Q/ k  sclass Solution {& C/ }7 j9 \- d9 F
   public int countMaxOrSubsets(int[] nums) {
; _6 w% V/ L# |: X* @% w2 b7 f       int max = 0;# X2 o" k- a* K+ U  r1 O8 f
       for (int num : nums) {# \+ ~/ F, s8 ?1 t+ a2 N
           max |= num;6 m, D- [( R! s. Z, O
      }
+ G+ \% Y( m; {. z       int res = 0;
! O+ u* u) c5 A) {+ n4 C       for (int i = 1; i < (1 << nums.length); i++) {& I! y. O3 q9 B
           int or = 0;
( b3 |- i/ N: j- o$ L8 o( o- i0 ~/ ]           for (int j = 0; j < nums.length; j++) {; _( j1 o; l3 g) I0 `4 h
               if (((1 << j) & i) != 0) {& m/ l+ E% C# N0 E( I7 U; ?
                   or |= nums[j];
" w( U% _2 J' }4 Z" ~. k              }" ~9 ^5 B3 X: X1 Q( d
          }
6 ~1 p  V& I5 ~1 u           res += or == max ? 1 : 0;2 k& v5 i2 g: s: x4 v& D2 R
      }1 L' M+ Q: r2 V& X) s
       return res;0 n" s! X' w8 h
  }( D* L4 @5 r% x# y5 f
}' o$ D4 @6 U. m9 G; M

! k- j; Z: o" k
& A% ?* j9 m7 f& O" @【 NO.4 到达目的地的第二短时间】
  P* \0 C% N% y% u
5 i6 U6 ^/ Y# j: t" G4 U解题思路
: ~3 W6 k; b' w2 g& \# ~" T# p" n; \7 r3 s/ n% D
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。9 c) S$ h. ?0 c

7 E; l5 K2 z7 H% y4 E; @& p代码展示& ]( F- z1 i1 G6 E5 ~$ M* g* g

% `9 x* H+ o, ?. Hclass Solution {' L( p- a5 b7 _0 [7 E# K9 o% [
   static class Node implements Comparable<Node> {
: I  Z( n$ J, h" t" W  P       int min;
9 Z4 x' s$ \3 J( M, V+ h       int idx;& l3 g; L; [: K8 P/ O
1 ]6 z& ?5 \, F' {1 T0 U* }
       public Node(int min, int idx) {: v5 f! p" f" i3 r
           this.min = min;
. W% H1 h5 x( }; K8 U           this.idx = idx;: b4 x! W3 b5 R4 X$ e- M
      }1 N( J  s. @9 B* r: W; w5 e
6 z  u$ P8 w- N& E" n# q' U
       @Override! u: N" v6 U7 q+ Q# l" C3 s/ S
       public int compareTo(Node o) {
" Z& s) o* {$ \) @* \6 _- ?) _           return min - o.min;8 D. G1 k- @" w
      }% p6 ^- x# _( y: ]# \
  }
! E* J3 H, \( T* h6 T, i( X7 z+ I4 z/ @( W5 N- b) A  f. a" u2 k9 j
   public int secondMinimum(int n, int[][] edges, int time, int change) {
8 }( D3 p8 F+ ^6 ]% u8 K: m0 r3 j) _       List<List<Integer>> graph = new ArrayList<>();
: @4 b: R7 A( e4 ~' K9 X       for (int i = 0; i < n; i++) {4 u* a& u) e: J8 E- ]' H
           graph.add(new ArrayList<>());
' ^! U2 Z3 H; E      }3 R4 p% O4 }- c6 e4 N7 ^# D
       for (var e : edges) {
; n: b( b- V: T' W7 {- `% p           graph.get(e[0] - 1).add(e[1] - 1);
# Z" g$ C! l: X9 a5 R( B           graph.get(e[1] - 1).add(e[0] - 1);
- V9 [& a9 Z  }- R) S- P1 v5 l      }
+ Q4 R; p) i5 g+ e: n2 r+ R  S* m9 z8 E( O) F5 q0 V% G, [
       int result = 0; // 最终答案; \8 [" V" _: d/ u' p$ H0 _" m5 q3 ^6 w2 |
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间), f" X* u: p6 e# Z5 A6 G
       Arrays.fill(min[0], 0x3f3f3f3f);+ ~/ r1 _. K2 k# K: P
       Arrays.fill(min[1], 0x3f3f3f3f);' t5 x2 o& n/ S% U4 H
       min[0][0] = 0;
% ?2 u' a: M8 j! T! i       PriorityQueue<Node> heap = new PriorityQueue<>();1 {+ m7 H5 @' R
       heap.add(new Node(0, 0));
/ u: V# ^" E- W$ y  b1 X. R' c       while (!heap.isEmpty()) {
) a6 K1 V% y2 m: Q* S* b           Node node = heap.poll();
+ H9 q; Q2 u9 u3 j5 B. B! R           if (min[1][node.idx] < node.min) {5 z1 \" ~5 T  {) \
               continue;
, u8 E2 T# Y- z9 K6 m          }5 P. B8 I& v% }& q* M  E) i' f
           for (int nxt : graph.get(node.idx)) {+ V+ l/ _6 k7 O" j6 c
               int nxtMin = node.min + time;
* M! r* I' K: q% K9 c+ N               nxtMin += waitRedLight(nxtMin, change);
  X8 Y% M2 a( o* S! u3 N4 F% d) Q+ Z               if (nxtMin < min[0][nxt]) {
' c9 |' K0 j8 a* g                   int tmp = nxtMin;
* V" Q7 N7 S; I* E  M0 ]) K                   nxtMin = min[0][nxt];
) M& d8 _0 {' b0 {7 M                   min[0][nxt] = tmp;
5 i0 `' p2 u9 C                   heap.add(new Node(min[0][nxt], nxt));
3 r8 S8 u5 O9 h* ?6 _3 W              }) K* ^+ K7 f8 q, s1 Z9 z- Z
               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {# L" v; }2 ^: I6 S
                   if (nxt == n - 1) {" d; O, B- \/ z3 n% R/ I/ Y
                       result = node.min + time;. z7 [+ P& n6 r- o" _4 n9 r
                  }
+ T/ W/ Y: F- Z# s6 D8 a+ b                   min[1][nxt] = nxtMin;
% H/ w  s' ?6 b' f; m$ x3 ~                   heap.add(new Node(min[1][nxt], nxt));' c) r( W8 v. k6 i8 u3 m0 m
              }
0 O& E- C7 a' W+ Z, p, I          }
2 e3 O; X$ ]; _* n# Y: Q* w4 @      }* p2 [+ B+ @3 ?( f
       return result;- b" g# ~- D9 I1 J) J
  }. L$ o  e# v1 @
' P, V  X) X3 G8 a
   private int waitRedLight(int now, int change) {) }# ?8 ~4 p/ i7 K  M6 u
       if ((now / change) % 2 == 0) {3 }6 U+ M  U6 X! f5 Y, e$ T6 |- L
           return 0;/ M6 l4 H. W# ]/ a6 W& ?
      }$ ?; {/ p: p0 H: I
       return change - (now % change);
0 u7 ~" Z$ [% x$ O0 L. l' ~  }
0 {& e! g4 T$ Y, f- E}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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