找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查句子中的数字是否递增】
6 ^! n  j7 K9 C6 m& a" B& e2 K  y5 v$ t. D4 n- s* q- a3 e# a, S
解题思路
, r; w1 V# w4 y* O+ _  e签到题。: z/ D3 d( C( m' k, b# t

" P' a8 q2 P+ D) w代码展示& L+ }! r* M- q1 ~- Z/ k2 y
8 _7 M0 V+ G7 J8 x
class Solution {
* h0 P* A; y& L) J! ~$ ~7 `6 P& _   public boolean areNumbersAscending(String s) {
% g$ i. ^/ [- m4 q& a$ c       var strList = s.split(" ");
) r- y( d) Q4 B# V# i' x( q/ p       int last = -1;' \! N2 y7 u9 s
       for (var str : strList) {
3 t. D! Y- c. t6 s. N9 P  {; \           try {( I2 f& ]6 e% k4 K
               int num = Integer.parseInt(str);: d1 [% {& U& M$ @
               if (num <= last) {# \  I8 Y6 W) u" `9 A
                   return false;0 B: \! Z# t* {+ ~% |
              }
/ \: c9 l2 [  r5 f( c, Z* _               last = num;' Z' e$ g: K4 r1 x! A
          } catch (NumberFormatException ignored) {
! W  _' `3 J; v7 Y          }
% o5 Z% ^9 H$ \# ?      }
+ u9 R8 S8 `8 [' b4 g2 r( {8 X$ ~       return true;! Q6 z' I2 Z  @6 H
  }  z' ^* p1 d3 f( x; f1 N# M. s( _
}" N( r! c$ ?; D& I! _4 a

& N- O" t+ i" e- c& M7 t
. m0 t0 y6 S1 W, K$ A【 NO.2 简易银行系统】
! I, n( L8 R, m! g8 c8 F4 B2 R( }$ a9 i9 |2 l9 F
解题思路' j8 S9 y, i: a( d2 Z+ |
约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
. D5 C' x$ `8 I* T" ]6 {
8 w1 M; }, H' b" o  \代码展示
9 i8 W5 q+ P4 A# C7 V/ e5 P( k  N3 ]* r& m+ O( [& X
class Bank {" v9 b7 B9 O5 q( l/ J1 V
   long[] balance;
% i# ^+ B% h( `! k6 c   public Bank(long[] balance) {
( P( r7 I$ S) A' U9 r: W       this.balance = balance;! O0 x; x6 d( Z- H$ _
  }* n  S. T) |+ I# \2 c
3 }; I+ Y% a% Y9 U6 I; h! ]) ?* z
   public boolean transfer(int account1, int account2, long money) {: ^* _0 y! F7 N) N
       account1--;3 d4 W& q/ t2 E. u' y# e
       account2--;
3 r4 n/ y: G( }- w       if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
" R( F6 I$ m1 H; X           return false;6 s) c% t, P7 M& o1 g
      }/ }  ?! S( T& z5 c
       balance[account1] -= money;# W! z. t, i7 q4 d
       balance[account2] += money;5 M5 W) }, K. \* u" H- ~
       return true;
- J  K; R. W. `7 K; c3 s  }
1 B& T8 B( [$ V! {2 b  g4 S
$ [% E2 F; ^6 b. T) `' k   public boolean deposit(int account, long money) {2 x% s; [( S8 ?! z& c; A
       account--;
  P' M" x/ G, N       if (account >= balance.length) {
* f6 y' j8 z! H( T5 U           return false;$ R) n0 P! N6 r' T% ~
      }) }; O# ~9 O2 g: b# ~
       balance[account] += money;( {6 q+ H4 O6 \2 Q2 {# t
       return true;
2 p: W2 X- E# a5 \4 [2 \8 ~  }7 z" S3 t. ?2 J  J( D3 h- x' U
, p( }' D3 T+ A1 P& G) t4 B2 ]3 Z
   public boolean withdraw(int account, long money) {
1 _3 c# R4 n6 Z! d+ |( e1 R, R% `9 n  A       account--;1 T8 k5 c9 Y' t2 I
       if (account >= balance.length || balance[account] < money) {2 w5 V, g2 w/ a* p" Z* k! g8 b' A
           return false;0 S$ U6 U  _0 ^
      }0 t& J& ?  x; s- D* D
       balance[account] -= money;$ I/ x! j+ H& P# b
       return true;  q' C! @( i: T, E
  }# P/ u$ F* X( i2 @
}
- n. w! Y1 O4 H( K# i) a# g; ~  Z  S
- u2 n* r3 u& f3 z
【 NO.3 统计按位或能得到最大值的子集数目】
7 ], z- t2 h( }9 H" ?& p
" S( O/ x6 g. T! u( \8 M. H解题思路
. [; W" v, m" ?: t2 Y: u1 [数据范围很小,枚举所有子集即可。
6 ?" A& f+ S, b2 I# P
5 Q2 n- `. q* @& O" y; y代码展示& e1 Q. c2 E! D
; i& S) Z8 a* r# D2 H9 Z7 N: z3 X
class Solution {0 {( B1 g) x9 D2 R/ \4 [! r+ U* F, C
   public int countMaxOrSubsets(int[] nums) {" r6 A# j9 d2 |" {
       int max = 0;
3 j2 \$ L3 _$ B) r) }& L0 W       for (int num : nums) {
& r# m2 `3 u, g- ?/ i           max |= num;
$ v/ P* K/ c. Y* U5 Y      }! ]$ ?9 q0 F1 R! G9 r7 V- q. X
       int res = 0;
9 f: L% D. p/ r9 v  Y       for (int i = 1; i < (1 << nums.length); i++) {
2 q) y( h$ F6 F" J           int or = 0;9 {% o$ f( V1 q+ x2 D
           for (int j = 0; j < nums.length; j++) {3 e/ I! k- X( ], v' X4 F- G! n
               if (((1 << j) & i) != 0) {
1 H# Q0 Z4 t% Y) ?& K% u' x                   or |= nums[j];
+ y6 x8 A* T0 a2 l" _* G; X  _              }
2 Z- M8 b( }5 ?: C0 Y* j2 O          }
4 B4 D' {' R- ?  q           res += or == max ? 1 : 0;
" v2 w( j- j+ U( [$ r* t, [      }0 \! f: H$ J! D0 O/ B, s
       return res;3 O5 K0 ]! S! S0 Q8 R
  }
3 O) [, q* v2 ?0 z}
. o4 Y  Q% p/ t. l5 t" X* z  z# h& e
2 H- C7 X) @* O/ {& v! u
【 NO.4 到达目的地的第二短时间】
, [- q6 q% R( Q, f) V+ t
% X3 _# p+ |* r1 p! k. f6 j( e4 n解题思路
, M4 m4 `( G8 G3 h6 @0 y% Y
2 p' A% x+ D: x# k2 B5 w- nDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
7 a7 _5 n+ N5 b
2 s3 N* T6 \6 E0 a代码展示
) w0 c  W8 m8 D! Y0 |7 C) u. N) ^1 K2 O4 }# u
class Solution {7 k/ f+ H6 f& b3 h6 z& p, n
   static class Node implements Comparable<Node> {# w, y1 T" k2 K( ]/ ~& _+ I
       int min;  l0 t, u" ^( e8 V1 w0 J1 v, C
       int idx;) v  L; y" w; F8 c* d9 @

4 V0 O# u$ F' B3 e5 Z2 U: B       public Node(int min, int idx) {4 g+ L8 V# o8 b1 C
           this.min = min;
/ @' B9 i, x3 G           this.idx = idx;8 K4 |1 j8 |4 x- v/ R# G, _0 S8 v4 D
      }9 l* a6 R3 K8 y. o+ _

! Y- N7 |! W, g7 Z       @Override
6 g4 n; G2 m/ Y7 G4 z8 U       public int compareTo(Node o) {& |8 y: p/ A* g/ l
           return min - o.min;4 S/ H* b) k! ^8 ~
      }+ ?& Q* b8 I( h4 `! ?+ P2 G
  }) V6 T8 N% P8 H- `
' X2 U9 k$ A! ~: b
   public int secondMinimum(int n, int[][] edges, int time, int change) {. @, ~4 O. V: p0 k# H
       List<List<Integer>> graph = new ArrayList<>();
/ O) _: O  F5 m       for (int i = 0; i < n; i++) {0 H  B& t8 p  r
           graph.add(new ArrayList<>());9 h- S9 @1 `, F
      }) v' c6 V. D( V0 [4 p# ~6 r5 y" Z
       for (var e : edges) {5 }: V5 m- h& x2 C& T8 h, C
           graph.get(e[0] - 1).add(e[1] - 1);: _# a9 [) m4 i6 H
           graph.get(e[1] - 1).add(e[0] - 1);2 m; J* e" k3 Q8 l" \+ t
      }% ]9 _) H7 Y5 j4 F2 a  U' e

' X# N  w; `4 R       int result = 0; // 最终答案; k0 v- ^6 `: F! ~" N
       int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)( P. v5 Q4 a  n* q
       Arrays.fill(min[0], 0x3f3f3f3f);
8 q0 I/ Z) V6 u1 O0 f       Arrays.fill(min[1], 0x3f3f3f3f);
' Z5 W# n) K) i5 S  m  p       min[0][0] = 0;2 c& x1 j& K9 t/ i) s" o7 h
       PriorityQueue<Node> heap = new PriorityQueue<>();
2 g  F  U+ S$ d# E, \) K* l7 p       heap.add(new Node(0, 0));, c: W" s; e6 L
       while (!heap.isEmpty()) {  }* o  I0 n) M+ A% Y
           Node node = heap.poll();
8 I+ R' S  M. |& C+ o9 K4 t& S$ @           if (min[1][node.idx] < node.min) {
; g4 Q8 k8 r, C) O. P  u! }7 i5 P: N               continue;
+ |' p$ i) _9 A8 d& c% l          }6 n1 T' B: I* ]
           for (int nxt : graph.get(node.idx)) {
! O, Q& B9 ^" q% ~2 `% R               int nxtMin = node.min + time;
8 O# B3 [$ \  k               nxtMin += waitRedLight(nxtMin, change);8 q3 [& M1 ?9 P$ W7 _
               if (nxtMin < min[0][nxt]) {
+ v& h+ v% Z" ~5 t' t% E8 X                   int tmp = nxtMin;8 w8 V/ S9 B$ G# e  Z6 N5 a
                   nxtMin = min[0][nxt];
, o& _0 h+ x; N                   min[0][nxt] = tmp;6 S9 o- S4 i( j5 a4 n$ E
                   heap.add(new Node(min[0][nxt], nxt));( U. a  W, N2 D/ w$ n8 R$ {
              }/ J" L7 I  i* b
               if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
6 x: ]- O) V# I+ I4 A1 i                   if (nxt == n - 1) {! t$ X( P+ o( ?
                       result = node.min + time;
1 ?7 ~1 i- b$ B4 u- y# ~                  }! D2 \: I) L% ]5 I4 W$ ]+ n  g. m
                   min[1][nxt] = nxtMin;" k4 }5 _& O$ q% e+ j
                   heap.add(new Node(min[1][nxt], nxt));6 }# E' j5 X  ^% O% T2 G) {
              }6 p+ p8 q1 _( g" l; e
          }5 [; D) ~2 L: L
      }, }3 H  p* V% Y! \6 I
       return result;* X5 v: q4 E6 P2 l, o" P2 f5 S
  }! T5 N6 A/ G7 I- G% L
3 A; L7 `3 h& M* l$ g, y
   private int waitRedLight(int now, int change) {
4 R( i) J4 Z6 m9 ?0 i& x" p       if ((now / change) % 2 == 0) {' F( @" T; d8 w3 D- X- [. K9 E  F  Y5 u
           return 0;
( y, V& G( Y3 l4 F      }" e+ v  m. I$ w' S/ e
       return change - (now % change);
/ O+ v6 W; w# H4 A7 q& @  }  K3 Z4 D# J, F
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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