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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否所有 A 都在 B 之前】: Y$ S( {0 N8 _2 k1 d* V1 `+ I
8 a* t1 ^. _# C
解题思路! Y2 }8 h3 ~& b- _: G' y' I$ U( O/ d
签到题。$ ^0 D3 T5 V* M4 h, o9 c

( v% W$ }7 r1 @9 y代码展示% C3 j, i! [+ j
# m' j) c5 C9 k/ C5 z- ~: [% j
class Solution {
$ h$ y/ l3 l2 j& \" N8 |  R   public boolean checkString(String s) {$ m1 W/ @9 L7 q/ Z/ ]3 O7 i
       return !s.contains("a") || !s.contains("b") || s.lastIndexOf('a') < s.indexOf('b');! X1 w' f1 w3 U* m& Z$ Y; j
  }# M: d% R3 U( A6 C: A8 ~* p
}7 U! u6 b# _. [* }

! [+ c0 A! R% g1 O【 NO.2 银行中的激光束数量】2 Q, o& F0 M# X6 e. u7 c

; S/ ~6 ^5 l' ]# o6 [8 b解题思路
' S( r) q& \  ~( O统计每行 1 的数量即可,如果没有 1 则跳过。! s& f! {) B4 \9 E, d; Y/ B% @3 d
) n: I5 l6 x. x: N1 ]  c! Q
代码展示- q* n' x( F* ~8 I1 |& I
; `: \) c2 |2 i- z3 J+ v
class Solution {
9 \( b  z' v1 w0 E" z6 {   public int numberOfBeams(String[] bank) {
. Z8 K* }& L% E3 K       int result = 0;5 `- x1 q+ E6 w* Z: e+ u
       int last = 0;
% l* f6 O$ \/ h; D/ j" _2 `       for (var s : bank) {
: D) T# H/ {; n/ {9 Q* C# X           int count = count1(s);; B2 }+ n4 T7 ^1 G1 Z7 G/ P5 @3 U
           if (count > 0) {5 P' B& f4 @& Y7 w2 D2 H
               result += count * last;
# g- v8 {- v& _. G: `% F               last = count;; B, G0 A% J' G4 A1 A: P& e. m4 J
          }3 u) p8 f9 n! e4 l# M# N
      }
: a* `% ]; G; _( u       return result;
/ h: D# A  c5 J& L  \; A2 E( Q  }* o( s: v( k6 S

6 V7 M) d7 w/ S3 B   private int count1(String s) {) W# }* a3 D5 v$ r
       int r = 0;
7 X+ f% {6 w/ {4 e% O0 s5 x7 K       for (var c : s.toCharArray()) {
8 L2 ?4 d; E' b2 L! P           if (c == '1') {
! D4 Q; l+ k6 }; `3 @. r4 K9 q               r++;/ E7 ], R7 i, ?+ w  N6 [8 y2 l( r: K
          }3 e7 @0 j  v! {( u3 g
      }: m& \7 ~4 i% G; s7 P# k
       return r;
' P+ S$ f/ u( m- R  }
4 J  v6 Q8 I3 z4 L  a}& o9 k9 r. J' {% s6 |
* G/ g7 G& k6 n; _
【 NO.3 摧毁小行星】+ `0 w& M& L' f
7 S0 v1 Q1 `( u) }! {: f
解题思路: e7 m8 v" U2 Z' Z, I
排序即可,注意使用 long。
8 q& [, R: P* m
0 {; @8 i1 Q: B代码展示9 ~7 |- j) f) X% f1 V9 F5 A; G9 x

" T' S& F) W' I* {; Y; u( h6 nclass Solution {- I( e+ t% I5 p
   public boolean asteroidsDestroyed(int mass, int[] asteroids) {
, I1 |# Z7 J3 P1 S# s+ Y       Arrays.sort(asteroids);
) n6 e- j- n& ^       long m = mass;
! G8 l* T, `0 g; L       for (int a : asteroids) {
. R, z! T2 D0 U5 n, z           if (m >= a) {
( k% b: z0 ]) ^5 b8 s; D) y               m += a;9 F3 Z7 d' U; Y: C  }
               continue;9 p* f1 Q( j  k7 ~
          }9 Z( U) ?7 H( U# V) X6 o
           return false;
* b( _& K" K$ ^+ o! O      }
2 ~9 B, W" n+ U. x8 Z% o# y       return true;5 Z' T  ^/ N! T. P5 x/ z. u1 o
  }
0 d7 A6 Q" i; C$ N}
, J0 s( q- l) \0 `8 e" a+ y5 B
7 h% A$ f: B4 x【 NO.4 参加会议的最多员工数】
; m0 B4 y3 k9 X6 }, H  q1 d% \4 I' [5 b9 q, \) [3 H
解题思路8 L) S8 T) E- m4 z) K8 }
实际参加会议有两种情况:
4 h( e/ |; W# I- _+ W0 f# i8 y- K) B7 G9 u$ M$ U
刚好是一个环中的人参加会议,这样可以使得每个人都喜欢自己左侧的人。
" m8 S+ t: f% N
( d% b( x; S$ r2 B  t3 C$ j有两个人相互喜欢,然后剩下的人形成一条链,比如 [1,0,0,2,1,4,7,8,9,6,7,10,8],这样不要求首尾相接,可以有多条链。
$ `: c% ^) A' U: A) r5 f: W$ \& e/ ~% I8 S' x

5 n7 y- h2 d( e# w" _代码展示
  n. k+ }$ s/ C0 f) O5 S: H
% Z/ i; R# |! J0 ]class Solution {
! S  @+ {6 u3 I4 m$ g4 S   public int maximumInvitations(int[] favorite) {
' k1 A) z$ Q/ G; y& _6 W       // 1 找一个完整的环2 j, P$ ^! s) A" M
       // 2 找多条链
: W8 W1 e7 M) ?7 g, F       return Math.max(maxCircle(favorite), multipleLink(favorite));
( @  G$ \6 S; N- G5 v4 C& G  }
7 W" q' u# g7 u: s' S8 S+ I  e- R0 }8 d! z
   private int multipleLink(int[] favorite) {. g- S% {5 i" Z( b0 p
       Map<Integer, List<Integer>> reverse = new HashMap<>();) s, ^3 X( r7 \8 |
       for (int i = 0; i < favorite.length; i++) {
/ M$ P! X7 J2 ]           int from = favorite[i];
. s4 X+ h- }2 ^7 g  |+ K           int to = i;
$ N; g3 D( x: t' `# A! Z& ~7 ^! ~           if (favorite[from] == to) {
9 |/ j& T( S- {6 d               continue;
0 A: R: D% h) l+ Y5 D          }  o! j; u/ x8 @4 P. O
           if (!reverse.containsKey(from)) {
9 ~0 t( I: @# K7 t               reverse.put(from, new ArrayList<>());  w4 e% v2 h6 I  }! p; f- _
          }
, v* ]) r, ?5 e& e" S           reverse.get(from).add(to);
0 |& V' p! e! c* G% }, M8 L, N      }4 R+ ~+ Y- q8 P0 @6 w. r6 Q" }" h& `; r
       int result = 0;& z5 P6 S, I! }" }2 b& s6 d1 D7 r
       for (int i = 0; i < favorite.length; i++) {0 M, r# D9 [/ K9 m% G/ W
           if (i < favorite[i] && favorite[favorite[i]] == i) {
+ c0 O& T/ |+ Q& @) ]6 n/ f               result += maxLen(i, reverse) + maxLen(favorite[i], reverse);
) u7 f& i1 {! Y; N% o" C) m3 G          }
2 h$ ^) d( `$ i: _7 Z      }; Q6 W, p/ P# o' W" @9 |
       return result;
' _7 l0 H! h0 E% L6 F5 y  }
$ Z/ F7 b4 U  g/ W9 ^" w, ~9 |* }0 ?9 o8 E
   private int maxLen(int start, Map<Integer, List<Integer>> reverse) {
5 X* Z3 ^$ v/ _, Q! ?       if (!reverse.containsKey(start)) {
8 W1 N0 ^- e7 ^" U           return 1;
: w7 e0 [1 h& c7 A: D, G7 F      }
! ~8 C* m- F* Q: o/ X: O       int max = 0;* X9 N* b; q# \& p
       for (int next : reverse.get(start)) {
% T( N" q- Z/ M5 R4 ?           max = Math.max(max, maxLen(next, reverse));$ g2 p- v4 W7 ]
      }) Z4 ]% F9 E3 k6 C+ B3 i
       return max + 1;
( G4 Z7 @- r( `6 N8 ^4 i# Z! `  }
4 d8 h) H- v% {" U# }
7 D& b6 O, j: e& t   private int maxCircle(int[] favorite) {
) e; @' Q  C9 f. c8 _2 Z+ O7 x       Map<Integer, Integer> step = new HashMap<>();* |8 S) d: ?2 @
       int[] max = new int[favorite.length];$ r* K' ?+ s) k7 Z& j
       int res = 0;$ I# ^, l. \9 X5 O" ?8 V- w
       for (int i = 0; i < favorite.length; i++) {0 o1 K% {* T# D
           if (favorite[favorite[i]] == i) {
, x/ ^1 s& J4 J/ T               max[i] = max[favorite[i]] = 2;6 t/ h2 @$ s; s0 r9 ^% {# H0 M
          }
0 h, y/ [+ h8 E0 X/ @' [           if (max[i] == 0) {
8 J! [3 u& }3 w3 ~9 f               step.clear();  B$ t* ^% i$ f8 Q
               getMaxCircle(0, i, step, max, favorite);0 ]% C5 Y5 v' s: I
          }) v( N) D. m9 G2 ]4 K" |# ]" k
           res = Math.max(res, max[i]);; l. x) V5 D6 ?8 t
      }3 @/ k/ u# p) V
       return res;
" ^/ H  z; Q# n& S3 T% U' V  }0 o0 ~7 Q6 V! H+ a- i& P& p

9 M" B- X1 W) {5 A; \' Y   private void getMaxCircle(int i, int cur, Map<Integer, Integer> step, int[] max, int[] favorite) {1 h$ T  n- [' o/ A6 l: U: f$ i
       if (step.containsKey(cur)) {2 e! g# I* K) Q  g
           max[cur] = i - step.get(cur);$ Q# U. j# y8 K% T/ |+ o# S
           return;
3 ]' ^% D6 a1 _: p5 C9 m! s5 c      }
& s% X; M* [; X1 z: `       step.put(cur, i);
. ^) I& q8 o( V. ]       int nxt = favorite[cur];
2 L9 I, O) G/ g# I: c; x) q$ R       if (max[nxt] > 0) {- @! \1 b5 \- r, M( D
           max[cur] = max[nxt];6 f+ r8 R0 K5 k0 S9 ]
           return;
$ e+ }/ K2 y9 J5 r      }
& L' \- ^' V$ w5 Q9 Z       getMaxCircle(i + 1, nxt, step, max, favorite);
  v2 E& l2 Q( g; r" G  I! B       max[cur] = max[nxt];
3 ^8 M7 j% j! u6 U7 i! M  }' P: H) ]0 k0 k
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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