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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否所有 A 都在 B 之前】; @1 x0 A! q% b. \
5 p; Q6 ?3 K/ d8 R; p
解题思路
2 h% m# _6 ~: u2 ]签到题。
+ D$ d1 f! @8 k& Y8 {% t# V4 Q6 D* F3 u+ U
代码展示& k, t) ?& n4 q
, b2 Q' s1 n8 z. v
class Solution {0 }) X3 g, R  B# I% z( a. @. ]
   public boolean checkString(String s) {
4 A/ V- Q6 F7 a       return !s.contains("a") || !s.contains("b") || s.lastIndexOf('a') < s.indexOf('b');
% R$ E7 n& U$ b& ?; N* A, W  }
! }& p4 ^) \$ B1 b* j3 {! f}
/ L, o5 \% N2 t2 ?& F4 U6 t' t3 K) u/ H& P' ?& Y* @
【 NO.2 银行中的激光束数量】4 ^. @2 O7 F3 u7 V1 c

* Q& U( H' l$ ?  a2 T解题思路
* h, S' T. h  o# H# J统计每行 1 的数量即可,如果没有 1 则跳过。
( X( S0 A8 a( C! ]( J- h$ n9 k1 S' T
代码展示* K( a& B) B+ `# e
. x' X6 S9 L. o* r
class Solution {4 P. c* a* H+ E9 X( l5 u/ Y* {' {7 H/ h
   public int numberOfBeams(String[] bank) {" r/ k( y' U8 `: A6 y) u
       int result = 0;% v( k1 }7 H$ J6 r! E- s2 W
       int last = 0;4 K( ]; H1 L9 W- s6 k' H1 G
       for (var s : bank) {
6 V7 O8 ~; `2 z+ h/ U. F# V           int count = count1(s);) Q% L, U. w- j  O: Y! o* Z
           if (count > 0) {
+ w# t7 i+ y. p  N* ~0 V               result += count * last;, }" s; H/ c7 x9 g
               last = count;, {7 ?  ?" e* R0 m% j$ z
          }
% P- v. T$ a3 f      }
& v5 s5 |4 }$ o+ U) C$ U       return result;
# o5 U$ x6 E  i( a4 k# |  }
" p( o* R2 Q1 R/ G; K2 |3 @
% t& S' g6 P* r3 U" [/ t0 s   private int count1(String s) {: ?1 U/ \. ], ]
       int r = 0;
; X) S' W& @: E- R1 z       for (var c : s.toCharArray()) {
0 l1 T8 @: b! l# s: N9 \           if (c == '1') {
9 D4 k3 e. B. d$ x0 `8 h3 O               r++;
" J8 U) G+ @( L) Q          }
3 ~/ q* C" M6 X+ l      }
( i. h/ g) p2 h1 \6 G, T. L# q: c; H       return r;
: s* \0 Q+ f& {6 o  }
# M+ W- ^% N+ s; |: @}
( I; D1 ]5 ^8 K0 Z+ ]# N
* A3 V0 o6 c) j0 j【 NO.3 摧毁小行星】) [7 j; z& d. ]9 G; l, d

% Y8 |: f. X! \& _解题思路( s; b# f% a/ C, P
排序即可,注意使用 long。5 }0 G- g2 Z' z) u! e+ W

& n0 \2 i7 r8 a% j1 i代码展示
: ^6 J' V3 w9 l( L& S# u, x$ h' O5 B) M' n5 X; q: {4 f- C; f
class Solution {
% t7 p0 ~; u& c   public boolean asteroidsDestroyed(int mass, int[] asteroids) {
; z$ F; F; G$ _* @, q& p* W& X       Arrays.sort(asteroids);+ u* L$ @$ Q( a  z! A
       long m = mass;
( B: o6 _; Z7 `6 B7 `2 e$ ~- M; |* x       for (int a : asteroids) {2 Z( p/ J9 P; w1 d9 U9 n% b. {2 c
           if (m >= a) {
9 C/ T$ W0 N" P& e1 E               m += a;
! V, r5 ^3 t) t1 t' h- O               continue;
# m. b2 M) a) ~+ w# B* X          }+ @4 ~/ i( N' l3 S8 Y; P+ t
           return false;
: j- ~' v9 p8 Z1 j# L      }
2 q6 H2 u) X8 M7 D; I! Q# E       return true;
: i; w8 g2 d0 n# }  }; o, H& K: o' u+ w! M# {
}9 L$ y" a1 }: @" [8 {
+ v3 b, T5 V( b0 ?+ x* N! s
【 NO.4 参加会议的最多员工数】
5 ~9 `# @& I! `
, j7 d* Y, P# o$ l解题思路
  A" q9 B% E+ n$ x实际参加会议有两种情况:. `  r% b1 n+ k% G& c
# h. H$ l6 M2 F( Z7 V4 f
刚好是一个环中的人参加会议,这样可以使得每个人都喜欢自己左侧的人。% L; R! R) i; n' P0 m- f

2 G( P+ {5 P6 [$ H: Y有两个人相互喜欢,然后剩下的人形成一条链,比如 [1,0,0,2,1,4,7,8,9,6,7,10,8],这样不要求首尾相接,可以有多条链。
/ L- K, n! h0 R4 t9 t( A9 `! y5 c3 O3 z& k1 K/ O

  D0 b- ]! V, D+ X# U代码展示( o% j* c6 m8 c# p) V# |0 c

1 o3 w; _# ]% }% ^8 bclass Solution {8 i2 c, g6 ?2 u* g0 O! O
   public int maximumInvitations(int[] favorite) {
- x/ ^2 w5 |" n       // 1 找一个完整的环
# t3 ?3 D( n9 j" t  U5 d       // 2 找多条链4 b# M5 m- O4 p" ?( ?. i- a- H, k
       return Math.max(maxCircle(favorite), multipleLink(favorite));
  P5 T4 J: n( X  }
! y$ w" h1 d* X/ r
  w, r7 w+ [  Z+ ]1 v8 r8 |7 o( H   private int multipleLink(int[] favorite) {
6 _" M# f: ^& X9 h$ @" n       Map<Integer, List<Integer>> reverse = new HashMap<>();3 k  Y9 v  y& l2 A8 @8 p( e5 I
       for (int i = 0; i < favorite.length; i++) {
' S4 s) X; ~* l           int from = favorite[i];3 Q0 I: S5 v6 k; k7 \
           int to = i;
0 Q2 p3 a7 F) {* b/ \- H1 H           if (favorite[from] == to) {
2 }) f: o2 P" k               continue;7 E2 V( c& o9 `! c' s  F3 Z
          }, f; \1 n* [3 q4 W4 _
           if (!reverse.containsKey(from)) {
3 o: {% A7 h0 o* O               reverse.put(from, new ArrayList<>());+ K5 s& S5 Z3 l' f5 L9 K
          }
, u6 M- R! d9 a2 I$ w1 V           reverse.get(from).add(to);
, Y2 F1 {' T/ a      }
; C( F  m; U: r* Q1 C       int result = 0;* u* ]% v1 |9 Z9 ?+ j+ j$ J. l4 M
       for (int i = 0; i < favorite.length; i++) {
/ E# _  x: s9 K9 r2 c: I           if (i < favorite[i] && favorite[favorite[i]] == i) {' o1 ^. p; a8 _" c
               result += maxLen(i, reverse) + maxLen(favorite[i], reverse);
6 f, k  h/ A/ F4 A$ G2 s          }
' N+ J1 Q. X# _8 E% S* A* n      }
; h  T7 b1 c8 \2 |' x       return result;9 M3 r2 n+ e9 k, r8 D2 a- @
  }9 `5 X" E, ]: v& f  @
3 D0 Q3 n) o0 S# @4 R
   private int maxLen(int start, Map<Integer, List<Integer>> reverse) {
  p6 O' K9 C5 d8 E  W       if (!reverse.containsKey(start)) {+ V: m1 O9 j' e  q. [
           return 1;6 X" ]9 _9 H5 c; K, P' b8 z1 V
      }6 F5 i1 ?: C3 S. j0 O- n1 H
       int max = 0;
+ ^+ [6 q8 N! y$ p" u       for (int next : reverse.get(start)) {
1 u, }2 T7 ]& T% Y           max = Math.max(max, maxLen(next, reverse));
# s# Y" [% x3 b5 s( T' ^3 F# o, @      }6 A# d5 i1 r+ [! a. m
       return max + 1;
0 B* B. s, O3 F" `  }
- Y- l) ~9 f$ E; J( l1 C/ d; r$ }, h1 K3 b
   private int maxCircle(int[] favorite) {
6 a0 [4 x' k2 t6 n3 i) s$ x  H8 O       Map<Integer, Integer> step = new HashMap<>();
+ u9 ^: r- W- p5 r2 O       int[] max = new int[favorite.length];
5 A  o3 v5 x) d  K3 H       int res = 0;) h6 V8 z+ {& U8 w. @- [( k  S
       for (int i = 0; i < favorite.length; i++) {
% T/ }& I! n+ a% `9 V- i  R9 R           if (favorite[favorite[i]] == i) {
0 u& N- t  ^& W4 m$ Z* A               max[i] = max[favorite[i]] = 2;
2 A5 A3 w8 H2 [  R8 F          }. v" S/ s. I$ Q: a2 v! l3 z
           if (max[i] == 0) {
) L; T" \: J0 `$ Z               step.clear();
1 n) m" R3 J  P' ]' v" l               getMaxCircle(0, i, step, max, favorite);
$ t) R. K0 c3 ~          }
, `( F: S/ ^$ x- c: _, D! E           res = Math.max(res, max[i]);+ E  k' k7 v9 H( E7 o, W/ K; F
      }
! n' B5 k. c, r2 N, g       return res;, T" ]' w( s" t5 i$ L5 H7 j
  }+ T3 x7 ]; v& L. {) b/ d
4 M; q4 D; k9 S2 j( }9 Y
   private void getMaxCircle(int i, int cur, Map<Integer, Integer> step, int[] max, int[] favorite) {
* I* C3 t7 K7 Y) v       if (step.containsKey(cur)) {
1 _# y: ?8 A" h8 L           max[cur] = i - step.get(cur);
: n) U8 p: u% y$ C# N8 `           return;
: }3 q3 B. P( Z: S; P; X; R9 n      }
0 t  ?: G" k# F$ W       step.put(cur, i);
( p" m4 m9 b! M/ I2 @; W, s) S$ u       int nxt = favorite[cur];
' N8 ?, `9 r, G       if (max[nxt] > 0) {
# R5 G  w4 n% G# A) o" D3 N, e           max[cur] = max[nxt];( `: Z4 `1 e5 Y4 k" Q+ b' U
           return;
1 M( ~0 Y( p2 H. r      }
* c& t! @  C5 k* t       getMaxCircle(i + 1, nxt, step, max, favorite);, T6 d' p- L8 B! I
       max[cur] = max[nxt];2 }+ z+ l8 {, c$ j( [' c
  }
" x- L7 y6 V6 ~  j" X}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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