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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否所有 A 都在 B 之前】. ]% a1 ~) i$ F7 U) b

9 t6 a5 h; ^+ [解题思路
+ v: G$ A4 E7 m- d7 j% S* l+ @签到题。
' J! B- S4 z6 A0 C8 Q5 K8 a4 `
8 ~, L% K6 s; Y代码展示
6 u8 b- u6 C: F, @( t2 i2 K  f. u! T6 V: h" o0 V0 P, L9 M7 N! M9 s  v
class Solution {4 ]+ }# b& g) h, j1 ]
   public boolean checkString(String s) {
+ N1 G7 @3 P% y       return !s.contains("a") || !s.contains("b") || s.lastIndexOf('a') < s.indexOf('b');
( @' Q* p6 L$ p4 ]0 |  }3 B$ Z7 `; H& h
}
' Q0 u1 X0 `3 P$ ], Z  a4 m6 B
) R  K5 W! t* t" e+ x5 |【 NO.2 银行中的激光束数量】2 W6 `$ ~! p2 C0 A- j' D; R
' U2 P! A# H- b5 N/ q5 a
解题思路
7 t- B0 J- o: u统计每行 1 的数量即可,如果没有 1 则跳过。
! F; E+ E5 r  |$ a7 W! k- M
8 t2 E8 h3 a' e( R0 [+ ~代码展示/ G7 p* P: b0 F8 y: t

# Y7 [, ^4 @; Kclass Solution {$ g/ N3 S1 a' g4 h& f
   public int numberOfBeams(String[] bank) {8 P, I. M; A3 G" E5 t2 B- w
       int result = 0;
  y* e8 C* ]& t- i6 a; x( Z( Q6 x3 A       int last = 0;1 l- `* ^" c1 w8 ^4 S, G. N3 W
       for (var s : bank) {
) p0 O, R; M7 H+ M8 d' |) v           int count = count1(s);" l8 T. C% j  i; y- h6 H/ t
           if (count > 0) {
2 k+ \  l4 }* ^5 o! L* Z               result += count * last;
# K0 f0 Q- \3 k6 ?               last = count;) v8 r9 v2 ?' ?! s; R# J
          }
4 {4 Q4 Z7 g* V4 ~0 S      }/ G2 d( |4 b: ~7 e
       return result;5 k; z, S% B7 x# A" F) g: o
  }
/ ?: V8 A  h; g* m; t. H5 K: Q* Y5 P3 J% _
   private int count1(String s) {, B9 n, u! V; n: i" ]" j5 W& _2 J6 s
       int r = 0;. W" f4 H# f/ W$ G$ v
       for (var c : s.toCharArray()) {
% K$ j6 L: A! K' s* d           if (c == '1') {
  B: |' o/ t7 x9 A/ Y  O; H               r++;! Z: x& P7 ^+ g
          }
$ N" Z4 u' E- E      }
. |. L1 ?* q  k% g) }       return r;
) k; j8 ?4 e. [2 z/ {! ^  }( h4 q: U" ~! n: o
}
9 S/ d( g* ^" w! \9 x
2 X& X: ]1 [# B3 z5 W$ y6 B【 NO.3 摧毁小行星】1 v& r5 d" p  ^  Z0 Z  F) w  n# i4 k

, [4 @. j7 J1 b' j9 U" l. ?解题思路
8 @: Q" w0 q* V: e排序即可,注意使用 long。$ D- g+ \* ]1 L

& h* d0 g- }. y4 h+ _5 J4 C7 R代码展示
) v4 A, ?- K: i, w/ Q; ~/ c7 C/ z
class Solution {
7 ~7 N: M& M6 \: q( X   public boolean asteroidsDestroyed(int mass, int[] asteroids) {
) D, K- c" v& l3 T       Arrays.sort(asteroids);
2 |8 a; ]( r$ M& x  B, |3 T: z       long m = mass;
, ]! e; t$ V- d       for (int a : asteroids) {* y7 e' a3 ~% |- V0 i/ N# d/ G
           if (m >= a) {( A" `* H/ B  X) u. I# @
               m += a;" i, C# [2 e1 m) x. v' N3 H6 ?5 ~
               continue;! V' L0 m" W& ~: f1 |: V8 i
          }
7 ^, H. E/ r/ T; {. G3 }           return false;2 P3 I' f, T9 ]3 G. f" O& i
      }
( Z8 W' O+ _3 ?- T       return true;4 f$ n+ o/ {" |! f" d& z" i& B9 m
  }
5 \7 T# t# O( a/ K; o5 x}
) B/ }. y0 B) D; ~
# s' F% c# B8 o* D【 NO.4 参加会议的最多员工数】  y  e% ^5 f) B, A
1 g% g) O+ [% f/ ]" U4 _4 N
解题思路; @+ Y* E% y) d( d3 k, ?
实际参加会议有两种情况:+ t4 u3 w9 A! i" S* A7 m8 J7 m3 a

% B0 A! t, P! C9 l3 F刚好是一个环中的人参加会议,这样可以使得每个人都喜欢自己左侧的人。
/ \. m0 ]! v' X% ^
6 d/ b6 v- ?% l8 C3 ]有两个人相互喜欢,然后剩下的人形成一条链,比如 [1,0,0,2,1,4,7,8,9,6,7,10,8],这样不要求首尾相接,可以有多条链。
2 Q/ s& X7 P( q# v
6 r5 p& e4 t4 `3 w( G# c' C: H- p
代码展示* [9 J1 M- K. x; c6 U
! P/ ~4 ]6 I) C" I/ o3 O( V7 i! w
class Solution {9 D# y2 W9 v$ D' G0 _
   public int maximumInvitations(int[] favorite) {
! y% j4 w8 C7 e# L  Q! h3 ~       // 1 找一个完整的环4 h* J$ ?- b, y/ g) \6 M+ D, N6 h- U3 H9 l& p
       // 2 找多条链+ [. M4 g( p& T* {0 p  P1 t
       return Math.max(maxCircle(favorite), multipleLink(favorite));
4 e+ F9 C/ @4 f% l. I  }0 T9 P3 Z, w* t- _  S$ v# ~
5 m6 }" A" N% H  G
   private int multipleLink(int[] favorite) {5 l# B+ _* W9 n: Y1 \! E9 k. @
       Map<Integer, List<Integer>> reverse = new HashMap<>();
* _5 y) S4 c7 f$ Z       for (int i = 0; i < favorite.length; i++) {. a( a: |3 x. p6 C3 p; h
           int from = favorite[i];$ i0 V* Q) _& y7 F
           int to = i;3 ]1 [8 ~4 w) r7 @+ }2 a
           if (favorite[from] == to) {7 O/ ]5 D% C6 r' O3 {
               continue;, C' H& F" C/ F9 b# w+ J
          }
! H9 Y3 Z% ]/ m- k, h           if (!reverse.containsKey(from)) {
+ u7 R* v9 X. U0 D% G" s6 v2 a               reverse.put(from, new ArrayList<>());0 I8 |/ H8 ~+ e0 z+ q/ i
          }2 |$ }3 t" D; r; T* n
           reverse.get(from).add(to);
$ q; |% Y  I) Q( D      }
1 S3 z1 U: _% z* B" a2 w5 W& ~0 M0 e       int result = 0;
  ^( T+ I8 z/ E1 U: e) m7 K, _       for (int i = 0; i < favorite.length; i++) {! N7 _$ g+ p& I% o) A7 d# k
           if (i < favorite[i] && favorite[favorite[i]] == i) {: `0 G5 |! T: S, o* c' a- v
               result += maxLen(i, reverse) + maxLen(favorite[i], reverse);
6 Q2 S- S" T: r) Q          }8 k' j3 {3 \  x6 ~2 x% D, e+ }' t
      }
" T3 v& [0 W* h# Y! W       return result;
" O  Z. q5 m3 f5 E1 m  }; P* I; ~" p* Y( R* U0 K7 k
; T/ e7 F: v% K' V7 K
   private int maxLen(int start, Map<Integer, List<Integer>> reverse) {1 j, b: e. k& T. t0 \- m
       if (!reverse.containsKey(start)) {& u; ?2 X! M2 P
           return 1;
: d: ^( H! ?5 l4 b! b2 D      }7 y, I5 b4 ?; f. Z
       int max = 0;. _- f, J/ C) W4 d
       for (int next : reverse.get(start)) {7 ?5 {2 L4 m) N# `' Y/ X) f
           max = Math.max(max, maxLen(next, reverse));
+ l9 W2 P' i# ]$ P      }
% g4 u, G. s8 n. M" Q       return max + 1;
  v0 ], R* d2 w. O* G  }/ K* d) z2 {) ~# m) }

& t: V( d- ]6 l- n7 M% a   private int maxCircle(int[] favorite) {" S" {8 t( }( ^2 z
       Map<Integer, Integer> step = new HashMap<>();1 F( J/ B3 K/ }0 I
       int[] max = new int[favorite.length];7 @/ b: l1 q6 q( b, \
       int res = 0;
: N; {& @* V1 S7 R: u       for (int i = 0; i < favorite.length; i++) {  Z! t+ ^2 l- A. `
           if (favorite[favorite[i]] == i) {9 a7 @* S9 k* C5 G' ?5 C
               max[i] = max[favorite[i]] = 2;
9 R4 `. \9 T" G: T9 Q, o9 X          }  O/ k% \4 z; _
           if (max[i] == 0) {
, {9 y$ U7 |3 \, X               step.clear();2 u& u6 h; S$ C" t5 e; ~2 w/ d4 s
               getMaxCircle(0, i, step, max, favorite);
% J7 K+ a& y$ e          }$ g/ d& K9 }+ S1 x! i
           res = Math.max(res, max[i]);. ^: G6 w: L: V3 R: V( r  T( q# t
      }: }) b3 Y. ?* S( ?- R$ i/ x& H9 g
       return res;
$ r, S) h1 Z, C/ p0 y6 O: k) t  }) c5 f8 h* ?" P: C

3 X% E# w- L! E4 B   private void getMaxCircle(int i, int cur, Map<Integer, Integer> step, int[] max, int[] favorite) {- q- \6 ~6 Z, T  l+ {1 L/ \
       if (step.containsKey(cur)) {" a7 b, w- @( I/ c
           max[cur] = i - step.get(cur);
' x$ v6 t, Q3 r1 K$ i$ [. r           return;) c! i5 Z2 c# b, S
      }1 _0 d. y* i! X" K8 B8 c! C
       step.put(cur, i);5 s: C4 b$ Q: ^' I0 p- z/ T/ x2 L
       int nxt = favorite[cur];+ L, a* _# P5 C
       if (max[nxt] > 0) {
# l- z: x0 U$ C$ {' a5 L           max[cur] = max[nxt];+ P! W* T2 V; D$ y
           return;5 x4 a5 l, g( H! b
      }
( }% K! [" v* S6 C& P       getMaxCircle(i + 1, nxt, step, max, favorite);
# ?7 p& z5 I5 X5 x" `       max[cur] = max[nxt];. I6 b+ F; ]; R8 z3 ~! n
  }  E  V9 J8 U& S' K7 I, |. w
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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