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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否所有 A 都在 B 之前】
7 e' ]9 O+ c. q$ R- k0 D" N
+ P) N7 }1 ^( t# h' \5 F解题思路9 U$ w3 ~' G5 Z( u% H' x
签到题。
. E2 F7 r: [0 H! Q
' v& m( X9 [& L# N- c7 p. i& O9 p代码展示
; v2 Y  V' g! f7 Y" m0 o
/ ^! y1 r% }7 r! Xclass Solution {
. I) D2 x; p0 V   public boolean checkString(String s) {
' b. ~# Q8 `: D5 ^       return !s.contains("a") || !s.contains("b") || s.lastIndexOf('a') < s.indexOf('b');
0 r! _9 a( p5 c" u( }9 d4 ]. b  }5 T/ y) f0 Y* A6 E# \1 b# Z
}
; l# E/ X9 r: d$ i3 D
5 j/ r2 a8 X5 F【 NO.2 银行中的激光束数量】8 ?$ {( ]- i# e8 W+ v9 }, }& ~
% N. I. ?) e5 j2 M8 P
解题思路  S5 K4 D! X" u& }2 f# ]1 p7 Y' v
统计每行 1 的数量即可,如果没有 1 则跳过。( _+ [+ \$ G3 ^) `! I
% O' P* Z2 `2 u# B
代码展示
4 N5 p+ I) f3 q5 c9 x( T* A; q
; L9 @8 p; W/ X+ `class Solution {! @  H/ c$ C4 g' u' G
   public int numberOfBeams(String[] bank) {
$ R1 C6 g! l* ?7 |       int result = 0;* C$ B! u) g6 m2 I- q
       int last = 0;# {$ i/ }' L  M: p& Q. T
       for (var s : bank) {( V: h8 E6 `( i+ Y
           int count = count1(s);2 |6 s) Q5 s8 z! S9 K$ M
           if (count > 0) {4 N: T8 z; ]- @. ]9 G
               result += count * last;; o  S$ ?3 z1 L0 e9 U  E% O
               last = count;
( }% e* z* ?: M. ?& t5 K" G2 G9 Q          }3 N* {' c1 p5 Z; e/ A
      }
& t# b3 z; g6 }! o) O, h       return result;: q" ]1 W- y$ b/ O  K: u. Q
  }
6 Q! U2 X# l* G, ]1 O9 W" Z7 D# B) \# R: F( ~/ U9 X: a
   private int count1(String s) {
$ Q* N% h2 j% y; ^3 H- O       int r = 0;- q: k% t7 g( |2 \- I. ?
       for (var c : s.toCharArray()) {
! s  x0 |) U7 u           if (c == '1') {# E6 l8 Z) Z, Q
               r++;8 e7 Z5 ]4 \/ `# |9 P& S- _
          }
7 ]! b: m! L* @6 c      }
0 t2 J: K8 C, C' y       return r;6 s; e+ r' R2 \" H
  }
- _/ f+ y2 w0 m( J) _7 g: F}
7 X& A6 j. v! v  Q$ o3 H5 x; _2 l0 J* j: l7 Q" h- j8 e5 S, ]
【 NO.3 摧毁小行星】
& m0 r7 L, Z- R4 P8 ~8 b9 d: }8 g- @4 D3 O# Y& A4 K! |! O5 G/ M
解题思路7 u9 b8 ~: v# L. [
排序即可,注意使用 long。
1 i6 Z: W, p; C, E. I3 O, o$ t# a" J, O+ b0 F
代码展示6 U3 J7 q+ {2 a9 y

! x5 m4 z, V% w. Aclass Solution {
# q2 Z7 [* K! W& c   public boolean asteroidsDestroyed(int mass, int[] asteroids) {
  J7 ^0 g* P* h       Arrays.sort(asteroids);3 s& [! m5 a. G4 H/ q
       long m = mass;
. ]" G  J( e6 J       for (int a : asteroids) {( N' ~, x  M- @
           if (m >= a) {
( l& X; ]5 p$ ]# \( ^               m += a;4 X/ H4 a/ B+ Y" G2 m8 G8 v4 x! B
               continue;( g$ V# I, e/ {( V. s
          }
3 \, Y+ h5 R; V- q! |8 W4 D           return false;0 z/ [7 s, B7 j5 v+ X% }4 ?
      }
8 l  Z( f3 b; T. u       return true;
$ o8 j/ k. X0 k3 j1 E  }0 d" w! B! D+ L$ f! {" R; ]
}
* f: b! p; K& f( _1 n$ {# e# t4 m& g; ]
【 NO.4 参加会议的最多员工数】
! M8 s$ @5 v( O) r0 r5 o3 ^  h
% X, I5 W0 Z; L! B" p解题思路: [$ z5 r" q6 d0 g8 b2 X9 [% g. x
实际参加会议有两种情况:6 h, }* L* N7 j9 r% i. W

. x1 k: p2 K. O- p- d刚好是一个环中的人参加会议,这样可以使得每个人都喜欢自己左侧的人。
6 N3 R3 A7 \# J8 N7 b
! Y. X3 H1 z$ j4 F4 d% a8 Q有两个人相互喜欢,然后剩下的人形成一条链,比如 [1,0,0,2,1,4,7,8,9,6,7,10,8],这样不要求首尾相接,可以有多条链。
" J1 A: R0 T2 l6 J0 g& {1 `
9 W4 S2 Z1 _0 v1 C
# U/ z0 P2 {* O代码展示
. P+ G6 d8 L' }2 R4 k
: J1 |& Y6 W& k% C/ `% Z  n, Bclass Solution {, C2 B: L! a- ?* s9 ~
   public int maximumInvitations(int[] favorite) {
# e' O( e( q" p       // 1 找一个完整的环; ?# B) q# A: j  |  v1 d2 Z' d
       // 2 找多条链' n5 n9 o) N: |& }. ~# ?, u8 o0 F8 j
       return Math.max(maxCircle(favorite), multipleLink(favorite));( q9 A- z4 k+ Y7 u* m0 h) {& s
  }6 T0 t; f# g; y% X6 n+ e: }

( q- M- Q5 t1 Y5 p. y) Y6 C   private int multipleLink(int[] favorite) {3 S' V, M7 y2 X+ S3 }
       Map<Integer, List<Integer>> reverse = new HashMap<>();
$ c) H, E# P0 r3 O' F8 y       for (int i = 0; i < favorite.length; i++) {" |* X2 s, S/ c6 d+ G0 G
           int from = favorite[i];0 A) L/ p7 O( [, ]; v  }& o2 Z
           int to = i;8 c- W9 {* }( [
           if (favorite[from] == to) {
3 O: M3 S7 ?* W* ]- z               continue;
4 \) W* g- I; u          }
+ V! O) |6 L# \" u4 z5 B, W, G+ K. B           if (!reverse.containsKey(from)) {) |# c8 X" A1 T- k0 T1 s
               reverse.put(from, new ArrayList<>());; T- p- V; B' L9 k, R" S% I
          }
2 t) q$ _& R+ ]3 E* d           reverse.get(from).add(to);
! L$ X. L, h, a+ Q! @1 O4 q      }( _6 I& @2 e$ n: [) w2 M5 b; U
       int result = 0;
0 P$ }+ T: H* S6 Q9 f0 s       for (int i = 0; i < favorite.length; i++) {
; l, K4 M" B4 U7 p' a, J+ Y           if (i < favorite[i] && favorite[favorite[i]] == i) {7 P, m6 n' i* v5 q5 \( r6 m" i( C
               result += maxLen(i, reverse) + maxLen(favorite[i], reverse);
+ o; d6 |6 i. B. V. J" @          }
3 q/ h+ @. z  \! A% c      }5 \. e( G# B/ G" y* E
       return result;3 h5 z+ N: o1 B& s0 Q7 g0 W
  }
& `9 e9 u/ F; S) h; `! d4 Z3 v+ a; \% \/ t. d1 U  F
   private int maxLen(int start, Map<Integer, List<Integer>> reverse) {7 K- \8 T4 d6 W: t: Q
       if (!reverse.containsKey(start)) {* ~4 H! p3 }3 M* g
           return 1;
! S& v, i8 Z( ]* {: E+ X$ n4 N; P      }8 t$ p  H% B' z7 x- j
       int max = 0;8 \, _0 r+ E2 B: l9 z! v2 ^7 h$ w
       for (int next : reverse.get(start)) {1 a* o% o" `1 b3 B
           max = Math.max(max, maxLen(next, reverse));
6 @! x# a6 c5 F0 Q$ y  Q! C* f      }
+ W9 s: [+ c" M) l$ K/ b       return max + 1;
/ x( V, k# ^$ k# i, o$ Q  }$ {) l8 Y6 {& e6 @

9 j4 ^8 q5 ~& t- I5 \   private int maxCircle(int[] favorite) {
. K8 z: S: _: x       Map<Integer, Integer> step = new HashMap<>();  `' Q" w! [, G5 c, t& C
       int[] max = new int[favorite.length];
" t" l0 m- q$ _+ N( b- J       int res = 0;* Y8 f: q4 z: V1 H) ?7 {4 B7 l
       for (int i = 0; i < favorite.length; i++) {
6 c8 p9 E6 O5 s7 i* ], U4 u5 `5 U           if (favorite[favorite[i]] == i) {
7 N& o: R9 u- ^: z1 Y               max[i] = max[favorite[i]] = 2;4 g; h. U- m: F0 ]& I
          }
6 u$ f4 E4 r% d" s4 \           if (max[i] == 0) {( e6 G( d; u( t7 t* Z; O
               step.clear();6 I0 R6 Z# B- Y( w  m( v0 O
               getMaxCircle(0, i, step, max, favorite);" d0 m$ V: Q9 w3 t& k
          }
/ N, J* j% ^& L- U$ A3 @4 T( ?) n           res = Math.max(res, max[i]);& I. N- ~4 f6 f( [8 c
      }1 M; k2 {# U3 I. @8 X6 F  ], j
       return res;/ Q8 z; _- K% l, p7 h$ [; r
  }
! r& c, A8 l* ~4 e
) B9 i- Q1 J. B" c6 s) M   private void getMaxCircle(int i, int cur, Map<Integer, Integer> step, int[] max, int[] favorite) {* |9 R7 |/ G" h1 A
       if (step.containsKey(cur)) {
$ g& m7 z  k% _, j% q. H7 u! R% K" G           max[cur] = i - step.get(cur);
) z: u% p. \2 \8 @/ v1 Z8 \           return;
  A% s/ \$ Q: d" ^" n* c4 q      }' X* q$ ], p5 ^* p- l+ A
       step.put(cur, i);- n3 T2 l" H) v2 [
       int nxt = favorite[cur];
$ B) l4 Z5 a) q* {       if (max[nxt] > 0) {
. Y+ r5 A5 G- p) n2 r) k           max[cur] = max[nxt];
# A0 L% `) E" o% b7 `: j2 z           return;7 z; y" R' _' m; F$ ^; Y, e* Z
      }0 x- M1 D) d+ G' |- P: R
       getMaxCircle(i + 1, nxt, step, max, favorite);3 x% i6 \4 _9 j0 L
       max[cur] = max[nxt];
4 I1 W4 v: N! o( V6 k* I- V  }3 ]) W: E) L1 F1 g
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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