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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】
& ?  S$ {0 n3 Y* D5 E
' @, B6 e4 |. ^+ M+ h  M& ?; h解题思路! D; z. ?- m; c  ]6 H6 H: |' F  f: c& J$ D
签到题。
: G5 a- H( b7 m, N* V. E/ P
* c; ?+ Z, z/ c- R5 V8 P代码展示7 A& Q/ b$ o6 {' [2 O
3 r! z! ~, O- s4 T  {5 v9 X
class Solution {
; ]1 a2 a& l! u! g% `- P* o   public boolean areNumbersAscending(String s) {
: G6 s7 v5 o# n, O$ u( _       var strList = s.split(" ");% _. B7 L9 G- s$ _  ^! V
       int last = -1;
4 x7 y$ ~# `$ @2 H& u# J" S* d       for (var str : strList) {
' I# M  h2 X1 Q1 |           try {
, M& y% F5 S! F% o               int num = Integer.parseInt(str);; @7 G6 O1 F5 n( s/ m
               if (num <= last) {! a# W! R; T5 U* ~
                   return false;- k, |9 U) O9 Y0 W/ m7 S
              }
; _6 a2 l$ x, C5 [- p' u               last = num;
9 O) M/ X8 }  N) d9 i4 S          } catch (NumberFormatException ignored) {: q2 l5 Z! ~1 N; S: O# m! h
          }+ J: C4 n- q2 p* ~8 @
      }1 K* X! p( @6 ]9 p2 r) }  R, n' u+ ]
       return true;5 d3 r- _1 t( d
  }
+ ^- w& [. ~* L& r( f}
6 s$ S. V; Y; |
" h5 g( D" x+ t- w
7 B* }- A- }% c  }4 P" r; D* w9 T【 NO.2 简易银行系统】* |" S; V* W/ p2 M2 v5 ^- {' f

! c& U* G  P& L5 D解题思路
8 ?7 W0 O% K. p5 O+ ]: c2 D约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。; N/ a2 c) j+ X

. R3 x. q& q6 L2 d) y代码展示
$ \" M' N0 q, q# G( b& Q6 g! J3 m% B; P' @9 ?
class Bank {
$ Y6 B7 ^0 u3 a2 {6 Z$ r   long[] balance;2 P. [$ k7 X  {8 n
   public Bank(long[] balance) {% Z  u* ~: `2 t$ v
       this.balance = balance;3 ]/ X# U8 H! p( D
  }1 u. L* p9 e1 t) z5 l/ V
2 ?; q: F9 Y" W
   public boolean transfer(int account1, int account2, long money) {
) v; W$ M$ q8 g% j       account1--;
7 `0 x7 V$ l/ S0 v       account2--;9 {  I0 U4 S& e8 {
       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {1 \; A1 [0 I2 W* p- ]# W5 o
           return false;
% A5 d9 x% Z7 p; t" Z2 \5 [9 E      }( N; u4 X( R8 L1 T8 ?: M2 b* \
       balance[account1] -= money;
2 S0 T. w- u6 }& l9 r$ j       balance[account2] += money;$ S; f) H% N" m4 D6 a  q
       return true;! E& A/ _, y4 K6 q9 U
  }
! [( _- w2 |# N4 m
. F" j7 W( P- R* Y   public boolean deposit(int account, long money) {
2 A4 W( x! ~" t& n3 l       account--;# Q9 f( m7 c/ ?" m# R4 w* [
       if (account >= balance.length) {8 G' W3 x8 I% m' l8 u8 E+ y
           return false;; ^/ {: \9 T- T& W
      }
% T: M& X1 b4 Y) X       balance[account] += money;$ J& w. F8 L  ]* f
       return true;' P( R( z, m* q9 C0 w
  }- ]9 S, b+ F7 X* t5 W4 L9 [

# k+ u9 q  B$ `- w9 |   public boolean withdraw(int account, long money) {/ [! j2 g6 A. t. b5 J1 i, S5 m% g. W
       account--;
% L+ S% ]6 o; R  ~8 a! y       if (account >= balance.length || balance[account] < money) {
  j) u5 M$ `! K0 N+ y* m9 S. R: x           return false;
7 M  H$ u3 i5 \& A0 F" }      }2 C! ^) ~2 k- U) B
       balance[account] -= money;
6 P( K$ G' O' {/ V* W       return true;
" p2 F  p5 W1 s9 Q" k  }( k4 i6 ~$ |9 Y# {2 a3 F2 C9 |
}! c! e) O% R8 T$ p; V3 h1 {" Q* _9 `

: [! ^4 T5 n+ o1 [0 J- G# T7 I# }
【 NO.3 统计按位或能得到最大值的子集数目】+ c! B' J$ c+ L

0 x7 Q9 D7 j7 W/ ~$ `4 l6 T) `9 S解题思路4 Q/ j4 M6 A, w% S. e( [) i% I
数据范围很小,枚举所有子集即可。% m+ N+ |4 Y6 i' f& q( I
8 C. {+ t" \, L- _  I
代码展示: j) _- }, G) i" p

/ c' g, t5 [; Q3 }2 [4 Mclass Solution {
- Y  Z% C! `" M" h   public int countMaxOrSubsets(int[] nums) {- M0 o9 j9 f  T, A8 e( k! X
       int max = 0;2 J. {4 `. C; w" j$ ?& _+ c! Y+ M
       for (int num : nums) {
+ ?3 l, o0 u, G1 F! k- d# Y' G           max |= num;
' d( g" c6 z; m' @. g# ?* X      }2 |+ M9 R% d4 e" o
       int res = 0;# O$ Z  ^. `' [% k& p& b  M
       for (int i = 1; i < (1 << nums.length); i++) {
) Q8 h8 ^/ g3 N" s5 @* a           int or = 0;4 p: q; O, j. c( p5 Z# ~) ]
           for (int j = 0; j < nums.length; j++) {# P6 j& q5 @3 C- a5 O9 P
               if (((1 << j) & i) != 0) {
9 t* Y) w, i: N& G, {9 d7 l                   or |= nums[j];% k' z3 l% n& w5 G1 V/ D
              }
$ @2 w- ~  w/ s7 K  e          }3 M7 P; g$ S! `$ B0 a' v
           res += or == max ? 1 : 0;7 R" h. V+ k7 v2 x
      }' G' V0 _# g, y$ J! l
       return res;2 @- |: b) U0 ]0 y9 T4 Z
  }* T1 X- _1 J# k
}- r( v  b0 H: u" ~6 p6 b) \
- ]4 f% o: ], k* a5 i

; u7 S( I0 N- ]/ A$ o) a# ?/ M【 NO.4 到达目的地的第二短时间】5 j: W# P8 ~1 ]4 Z7 p5 s9 G

" e7 Z( w- @  G4 f* x解题思路5 f( R2 w+ h2 [3 i1 J
+ ~* a( j9 b, _- s: j, z" [
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
, g, `  B7 r8 a( M' V) q  }! d, q8 M- v2 s# R# w) r( I9 R% H
代码展示
: @; K# h2 ^' ^" x
* g/ s/ A- z' [  Q8 Nclass Solution {
1 x, i7 W" @  {2 \+ B0 @$ l   static class Node implements Comparable<Node> {. U' s- H& q/ |
       int min;
  V1 h( X, _/ q: C2 N: t       int idx;
3 d3 p+ r6 {) @2 R% B! k% V) H7 D# x7 B) s7 n4 A4 S% ]
       public Node(int min, int idx) {# A2 `0 w: d# |, H3 F
           this.min = min;/ A( y7 r: J  r" o; Q! Z
           this.idx = idx;
% t0 t1 ?2 V7 ^      }
4 P- j- x& d! x9 p4 {; \) U, @; O1 V; T
       @Override" {0 H! S' i+ {: w; z
       public int compareTo(Node o) {. y4 Z+ X2 D% j
           return min - o.min;
* ^2 d  z4 j. D1 R: Q. i% V      }
! u! v  }' @/ P) X. H6 x1 r  }1 X! W# P* }, _5 M9 E8 z0 Y$ N
# O) s' i/ v$ K& ~
   public int secondMinimum(int n, int[][] edges, int time, int change) {* c+ [7 B' ~& T+ M1 V2 {: A
       List<List<Integer>> graph = new ArrayList<>();/ M, \6 [  }. _& u: H2 }
       for (int i = 0; i < n; i++) {( x, S: c# g* |- E* s  H8 J# q3 g) `" {5 i
           graph.add(new ArrayList<>());
! u: z, d- G* Y  _4 Z2 F, I0 u      }
7 A! N/ W' d3 |       for (var e : edges) {) q) F( p* s5 `# F  ?
           graph.get(e[0] - 1).add(e[1] - 1);
; ^) @0 B) M+ u1 x- E) Y$ F           graph.get(e[1] - 1).add(e[0] - 1);7 u2 x+ `! P2 ?3 k2 [
      }
' Z, l, @# p9 ?) M  s8 J& G' H# x( |3 W* O; Z9 E& Y, Y- f5 r  S
       int result = 0; // 最终答案2 e2 x) P3 e) X# k7 x% d
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)1 k) o) t# P% @' a
       Arrays.fill(min[0], 0x3f3f3f3f);
$ B$ J- g/ E" T       Arrays.fill(min[1], 0x3f3f3f3f);
6 x- p( K3 |, l% H  H4 M9 _" c       min[0][0] = 0;. l3 R3 A9 ^# z# a, A
       PriorityQueue<Node> heap = new PriorityQueue<>();
, \- x) m! k6 w/ ~. h       heap.add(new Node(0, 0));7 r8 S" Y7 p5 C" m1 K* E) N. H  G
       while (!heap.isEmpty()) {
' ?& d! v, M4 X2 }/ w. D           Node node = heap.poll();' m7 I& P- u+ j" Q; I/ O
           if (min[1][node.idx] < node.min) {) _. F- l' e. \
               continue;
& I( j, g; K' C, F9 O! t+ t9 K          }/ U! f. A" F# n  E: l
           for (int nxt : graph.get(node.idx)) {/ e: Y$ r5 l  t; b
               int nxtMin = node.min + time;) B& _# ~" y. H0 g
               nxtMin += waitRedLight(nxtMin, change);
( v; X0 e' o) A* T' M4 m               if (nxtMin < min[0][nxt]) {# j, K' a0 ^. D/ e
                   int tmp = nxtMin;. ?* E* ^  t9 J& ^( G, W) z3 e
                   nxtMin = min[0][nxt];
$ G  J5 D0 x7 R3 M, A+ i; t. b2 o, E                   min[0][nxt] = tmp;6 i/ T; ~# r  k7 x# n" }1 b( e; M
                   heap.add(new Node(min[0][nxt], nxt));0 `% \% |. n! g+ G  P0 R* f
              }3 x  X: Q1 t' p( a, A- Y, F) q% ~
               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
" J" p& w% y, B" y! c- Q* [+ s2 V" B) k                   if (nxt == n - 1) {7 M, y" l# ?- `0 ?7 e) o  A
                       result = node.min + time;; A/ E5 G3 t2 O6 [2 ~6 i! r8 c
                  }* V" f) K) C$ i# b* y9 U
                   min[1][nxt] = nxtMin;. D6 E$ K, k- t& Q) U# W7 @2 |, _
                   heap.add(new Node(min[1][nxt], nxt));
/ T  c, r( @2 Z              }
/ F' I: A2 n. O6 {5 t+ g          }: {) I6 Z9 z$ Q8 j
      }
, O  W- C. o) P' T2 T: m  R       return result;5 G4 f' \/ u" T* P
  }
) [' x$ Q5 L% m. H+ V3 H6 O6 s
$ W3 K( f1 v! T- s+ y( K/ u' J2 [   private int waitRedLight(int now, int change) {. `/ j' ?- }/ Y' b
       if ((now / change) % 2 == 0) {& n0 p, X7 t* s
           return 0;
* F) l+ I8 O5 t1 Z& V) o( ]! x      }
& n; B# p: S* ~! F& ~' c' F6 u. N+ L       return change - (now % change);/ I3 i4 j- ^- J; C) e' l
  }
& ?! V$ j4 M0 S0 H% Z* j: t: ^: h}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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