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

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

上岸算法 回复:0 | 查看:2086 | 发表于 2022-1-3 21:30:37 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否所有 A 都在 B 之前】- n% J9 J2 t% ^
& {/ _3 J' p: h4 W1 R. d
解题思路
. q. ]8 Q4 W; e  @签到题。
+ C- o# ]! D/ w1 w' p7 h( h' v$ Q, S+ k1 a: ?
代码展示
* G/ G1 z1 o1 t+ W0 U
! u9 u/ q$ ]) Wclass Solution {
* ~6 c. P3 e$ }- z   public boolean checkString(String s) {; @( {1 B) A4 {
       return !s.contains("a") || !s.contains("b") || s.lastIndexOf('a') < s.indexOf('b');
8 d' x9 ]- m5 d( P: G, A  }
: n: Y: l0 W6 a# w}
5 N0 t& V: r7 m7 w8 u
7 k$ P; Z# E# h2 C* o( i【 NO.2 银行中的激光束数量】9 W9 v4 S& n$ O! t$ q

* h+ A( f3 d5 e2 W4 i2 b解题思路" j" |6 }" Q5 E2 {% W
统计每行 1 的数量即可,如果没有 1 则跳过。
, ]  `- O4 `' H2 V8 M' b0 _; T
* m4 |  o/ F2 X2 Z" X, v/ Z代码展示2 T+ C% K. @9 D0 [
( O( w* ]: |" b( U( ~
class Solution {9 D1 [2 J, O+ I) |+ D0 v
   public int numberOfBeams(String[] bank) {
# F, U6 L- w$ K       int result = 0;+ l! `, O1 r: \* ]; B; x* u
       int last = 0;8 u! R$ Z8 m" T9 M
       for (var s : bank) {
2 e% N. S! ^0 F3 o. q( ^           int count = count1(s);
, g& C" b8 y$ L: D: Z, R. L7 Z           if (count > 0) {; i. a* Y" _6 S- J' M
               result += count * last;
4 u% u) D7 k. J! K               last = count;3 @: n( ?# V" `6 C! _$ H
          }
9 k9 w& A& W- w* H* J1 e2 i      }( A; w. _- c) X
       return result;$ Q- t" T$ N) _0 A+ G; U
  }
8 `) }( y3 |- c7 @3 W6 [3 V3 E3 q; ~1 b
   private int count1(String s) {/ H" j  u( Z$ p$ a3 f/ Z( t' K
       int r = 0;3 W, K! e- g. X5 v0 R$ v( |
       for (var c : s.toCharArray()) {
6 ^( I7 \' ~% B% W3 G           if (c == '1') {9 G6 D- v( m7 I* s  a/ g5 Z* i- i8 w
               r++;
$ {! h: }* _9 _$ }          }
) F9 C, {$ P/ P9 ^* P      }
  U2 G, G0 O- \' B/ `# @       return r;9 @0 y  X, L& [3 P1 S
  }- B; M# H7 [4 A/ }! g2 V1 `# Q
}
3 W4 L  R9 [: ], g& M1 b$ e# j: Q9 U& ~; J; Z4 ~
【 NO.3 摧毁小行星】
4 m$ n5 g2 v1 }- z: ]$ o0 e  L# g: ^! M4 l
解题思路* X& O* L8 {1 p, A" A8 x
排序即可,注意使用 long。7 A' ^% m1 M# D. Y* m: D' T/ j
* U0 V4 }: T: |3 v0 y4 E: |8 J
代码展示3 @/ {! s  b' a% Q) `

/ e9 s# d3 L, `: Aclass Solution {7 Y' C) B' Q! T8 s( i% s& H
   public boolean asteroidsDestroyed(int mass, int[] asteroids) {/ F4 S) t- P2 Q. h7 x: `! F0 m
       Arrays.sort(asteroids);" w1 @5 v3 d) P" W) y/ T* _/ e
       long m = mass;8 K5 j2 c1 w# i
       for (int a : asteroids) {
' {& B/ w  v7 k+ s           if (m >= a) {$ b& x+ [2 b" R1 N" Y
               m += a;
5 B$ t9 n4 v1 Z& o0 a! R' P) |$ \               continue;
) x5 _4 z4 e2 \          }! \" {5 f3 c8 e
           return false;% o& [2 k+ i+ n
      }* z' ]7 A) c" G1 h1 _5 P
       return true;
3 c4 U2 W9 D" c, ?5 E9 h# m2 P+ L  }
! D6 X/ `% Y# o/ g; S4 S}
$ K5 [% x4 E5 }. u$ F1 F: B% I
7 Y% s) H7 h7 J6 W, m* |4 S4 d- w【 NO.4 参加会议的最多员工数】
" @# Q# g  m$ \2 F9 G9 I: Z5 {6 f; w* U4 A' w4 w3 b2 q
解题思路1 }6 V; D$ ~1 N9 D  g
实际参加会议有两种情况:3 e! q% s% }( u+ Q: i
) ~# w; p0 J7 o3 Y
刚好是一个环中的人参加会议,这样可以使得每个人都喜欢自己左侧的人。
6 |6 j4 I' n! c
: `( P( X1 ]0 N1 L; r" w有两个人相互喜欢,然后剩下的人形成一条链,比如 [1,0,0,2,1,4,7,8,9,6,7,10,8],这样不要求首尾相接,可以有多条链。+ U4 O/ K$ G4 d* D

, ]) D5 k& P1 C1 f; y* V. g& y6 f
+ d9 P0 K6 H8 \% Y" D3 A代码展示9 Q8 o& n2 T* v2 B
, _/ p1 [5 }2 G
class Solution {( T* K2 R  c0 O. q! N: V
   public int maximumInvitations(int[] favorite) {
  e& C% G8 \' J8 A, {& s, _       // 1 找一个完整的环
* p+ ]$ N$ p4 i9 s5 a* X5 g       // 2 找多条链9 ]5 x0 u# }7 E3 B7 W$ V$ I
       return Math.max(maxCircle(favorite), multipleLink(favorite));# \6 Z3 ?5 J. M8 F! f& \
  }" Z1 ?* g% }; L& F
/ B2 `/ b) ^, t9 T
   private int multipleLink(int[] favorite) {  v- j* ~. @. ^: z% K3 k+ D! G
       Map<Integer, List<Integer>> reverse = new HashMap<>();6 Y/ i) a) G, r3 j7 f5 H" ]
       for (int i = 0; i < favorite.length; i++) {1 D2 b4 w& M$ Z- k" E+ V
           int from = favorite[i];4 o9 b1 M% g! X4 \3 ~/ m
           int to = i;& P# M1 \. V0 v0 s
           if (favorite[from] == to) {
% Q7 ~. ^) H9 ^$ Z& g( g8 v% e               continue;
9 A- ^  E: R' m7 F" \! A* W          }- _( u6 \3 F% X7 g1 }
           if (!reverse.containsKey(from)) {# G$ `- Y) [( H* ]. t4 }
               reverse.put(from, new ArrayList<>());/ J7 h. d+ _4 U3 b
          }
9 A6 a+ z) E/ T5 @4 m0 y           reverse.get(from).add(to);+ F$ B) u% G0 ?8 r% g& Q1 ?
      }
7 J3 b$ P2 d5 W1 n' I3 N       int result = 0;
+ t" ~. o7 u* @. s) |' {9 k       for (int i = 0; i < favorite.length; i++) {
5 W* o8 z3 ^8 e5 X! Z6 I           if (i < favorite[i] && favorite[favorite[i]] == i) {
( S% D& ^4 ~2 a, ^( h3 l6 g               result += maxLen(i, reverse) + maxLen(favorite[i], reverse);: T8 e, G7 ]3 U- @
          }8 G, s8 ?4 h# [' ], C! U* I3 e. s
      }
5 ^! J6 X1 M5 ~' P' \       return result;7 v9 N% o1 }3 u) C; ], Y7 L& ^3 ]
  }  n, M1 ^" [5 n3 v+ }2 g
$ s1 K0 z$ ~% b% d. {9 t/ m7 h
   private int maxLen(int start, Map<Integer, List<Integer>> reverse) {" }; z# f8 R/ R8 }
       if (!reverse.containsKey(start)) {" P+ p+ R0 v5 y* E. I: R0 A& X
           return 1;: l& g2 x7 x1 Y3 `7 R5 ]4 i
      }) ]( s+ {7 k# {. u9 G
       int max = 0;0 l+ u4 q3 a9 w
       for (int next : reverse.get(start)) {- Y7 s5 L8 z+ Y! {! }
           max = Math.max(max, maxLen(next, reverse));
! k, z! X* J: P# N2 X4 n; q      }
) J. A0 P% k; }/ N; h       return max + 1;
) g. C; @, [; W) m- J9 o  }5 @1 H& z4 I8 U* j1 h& t) w
5 D1 ]! H4 _5 j5 J0 k5 b$ G
   private int maxCircle(int[] favorite) {
0 Q1 V$ T) k; c$ q2 x' F# k       Map<Integer, Integer> step = new HashMap<>();
1 O' V4 g  |+ o       int[] max = new int[favorite.length];
  ]. w- N/ P4 S       int res = 0;5 U4 u6 {. ~- W' n( `
       for (int i = 0; i < favorite.length; i++) {
3 {7 m' @( B! H) O( ~+ U9 J           if (favorite[favorite[i]] == i) {
/ l, r, u( p3 u/ M               max[i] = max[favorite[i]] = 2;9 p( l8 B0 m. S3 q' r& E* F3 |
          }  ~, x/ {3 b6 ^/ x  E0 U% R
           if (max[i] == 0) {
) k2 U) h( w6 R- Y2 N! W               step.clear();
& L+ W2 h6 V. z7 p" a, J               getMaxCircle(0, i, step, max, favorite);- }3 |- }" _! M
          }
# b) j9 ]" a' [           res = Math.max(res, max[i]);
1 M  R& ^# `9 u  x% A$ ^( k( G) W( ?      }! ]/ q* u. F6 U) j
       return res;' j' {; W- W' K' O. y
  }
6 w4 h! d: r. A* M1 J% D) Y2 J& ^9 P: E
   private void getMaxCircle(int i, int cur, Map<Integer, Integer> step, int[] max, int[] favorite) {  p0 H; ?: c) Z. f& O
       if (step.containsKey(cur)) {2 ]. [; Q3 E/ }% Q0 N. W- }1 C
           max[cur] = i - step.get(cur);
& A, g  ?+ u# p$ z# N% C: h- {6 e9 o           return;& @- \6 D; p) `5 X+ l- \" K/ `3 t7 a7 v
      }
( ^0 S2 \+ r5 a1 ^9 b       step.put(cur, i);
4 U! J! t& _' _- Z       int nxt = favorite[cur];
0 v* j  s7 Y9 p/ B9 J. F. {+ i       if (max[nxt] > 0) {
7 U' J' P5 j4 p+ c; C6 n+ e           max[cur] = max[nxt];! \1 ?4 a& N, y" r" z! P
           return;
2 S' V6 T! I3 E9 z4 c1 H      }
4 H+ f) N% f! G1 t! M! `       getMaxCircle(i + 1, nxt, step, max, favorite);
  M% L7 w0 P4 c, X2 H! }       max[cur] = max[nxt];
- z6 r+ y1 u8 g+ V1 ?! h4 T7 z  }
" i9 F8 n( V# j% w% U; @}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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