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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 检查是否所有 A 都在 B 之前】, Z, _+ T9 e0 i% h/ q0 P. y

9 y% t. ]4 G  u6 P+ Y2 `  c) z解题思路
4 m' ?) E: m/ j' @0 H签到题。5 a" t4 g9 U7 a0 }9 @/ E: d. [/ i
4 \" W" P7 y6 @. o3 l6 A
代码展示
! K2 h/ ]+ g2 q, Z1 W
: H+ `$ D- d4 ?class Solution {5 p2 w" l/ c8 b# d4 s2 |
   public boolean checkString(String s) {
' |2 o5 y6 q& v7 J6 _6 h9 A1 [       return !s.contains("a") || !s.contains("b") || s.lastIndexOf('a') < s.indexOf('b');
! I5 g. a# M8 `  }
3 I1 Z# r% ^3 k5 a}
( v6 W$ b3 U+ u6 H, }* J: u# f7 k( u0 O. \
【 NO.2 银行中的激光束数量】$ x, @8 I* s" @- A

% R, _$ a+ Y3 Q9 _8 M2 I解题思路; a$ o+ X6 J/ R/ u
统计每行 1 的数量即可,如果没有 1 则跳过。: W( j. H% d9 [9 D' c1 N0 g

% T) z( [1 q& o) [" P' C代码展示5 a: d  g5 j1 h3 R

! N0 U0 s! J) H7 T2 p# M& ^class Solution {
4 j" Q& k$ `' K  u2 ~& @2 {   public int numberOfBeams(String[] bank) {
+ l" S* M' ?6 Y7 u5 y3 U( @* u# R, f       int result = 0;6 d5 w0 B0 [( O+ @
       int last = 0;0 E- `5 z5 {% n' J9 O; _( x
       for (var s : bank) {; ~# N2 ~8 g) `
           int count = count1(s);' p. m/ v) ^5 u  R  p# s
           if (count > 0) {, ]' z9 J2 G  m0 v, V6 c
               result += count * last;
. z! h6 Q+ n2 y5 L               last = count;- R% g" N0 b& G- u$ m# \0 W" u
          }
4 d5 {* z# P; L. M      }1 W5 |7 p5 `! |3 E
       return result;0 j2 c$ X' j" N- L3 n9 W, J
  }6 K9 y: Z- K: y( N. t) S0 D
5 x3 V1 n6 j/ w& l; J. |/ H0 \
   private int count1(String s) {
* @( L3 U. g' O+ F- S       int r = 0;9 b  _. Y: u% k! t! }% J
       for (var c : s.toCharArray()) {8 [& d" M) ~' @$ {! G5 {; m2 p9 A
           if (c == '1') {/ f* U9 p% X; S
               r++;& ~' R0 |, |# a) M5 R
          }7 o- D% ]9 M4 W/ Z+ e; n. T, B
      }9 V. {, G$ \+ X  ^$ I
       return r;
+ d7 K' u; _  T8 D0 B3 a3 S4 n  }
* \& r' D; M4 x+ [0 w}+ ?+ X( a2 |1 Y  }, s# t
! t4 P5 g: T( q5 W* R
【 NO.3 摧毁小行星】
4 U2 L# x. G3 J4 l
) S' O/ H( R' U: H/ [9 ^解题思路
% `2 y( U1 d9 G0 Q排序即可,注意使用 long。
" v6 b, K- H9 ?7 g, K
6 f- N( Q$ Y" u, q; j8 p代码展示$ m3 {2 Y: @7 M2 a' V
, u# k) e9 I) ]$ H
class Solution {- K2 t. B8 @6 m0 z  L8 ]( ]
   public boolean asteroidsDestroyed(int mass, int[] asteroids) {9 p( t- p1 e; K5 w
       Arrays.sort(asteroids);: Z  M  r/ ]2 `3 H% |& W
       long m = mass;
* Y. R, s" n+ ^7 S4 P       for (int a : asteroids) {
; N1 l; y  Z& F4 m           if (m >= a) {
$ ~1 e9 y/ }  T7 s               m += a;8 M9 V9 c$ R1 b' M) X4 S; E
               continue;
. x/ O" F, _) J5 r8 J7 ^          }7 x7 U: f" y+ l: Y. |$ e
           return false;$ T4 r& H' X! w0 E
      }" E1 E  {; p' |) r' z& q
       return true;/ \3 {& O& ^3 _* e4 }
  }8 y/ p0 b. q4 Q: K6 ]6 R3 h# p
}
6 d0 J- w& ~% d, M+ m
0 X$ q/ i8 b3 v& h【 NO.4 参加会议的最多员工数】
0 n. ~& A; Z) ~: e1 {, ]% g/ ]0 x, z; C3 y7 o6 r  u( ~. o
解题思路
2 S8 q  x# E9 p% @- w7 |- i实际参加会议有两种情况:
1 O: e0 \) |; K) H* S" x  }3 f) m# F7 a; B4 e; F2 `  e
刚好是一个环中的人参加会议,这样可以使得每个人都喜欢自己左侧的人。
$ p) ^6 c/ e( @
' a6 a5 d1 a2 P. r0 r! \: Y有两个人相互喜欢,然后剩下的人形成一条链,比如 [1,0,0,2,1,4,7,8,9,6,7,10,8],这样不要求首尾相接,可以有多条链。' \6 l5 {- [" l0 ^* q- r7 @) ~9 ~
. i  @0 l0 C% ^- }- Q' a. O
7 ^- m9 G# _! y7 D( u6 v
代码展示
4 z% U+ i/ H, |* b. ~
' U- y( S. E6 U) qclass Solution {& S" q# ?9 O$ E1 S
   public int maximumInvitations(int[] favorite) {0 R+ F& M* Y4 |5 E3 s6 J
       // 1 找一个完整的环
5 I8 G2 k, N& j  M; ~7 m       // 2 找多条链6 W" Z1 g( x3 P' J( `4 n: M
       return Math.max(maxCircle(favorite), multipleLink(favorite));
* m0 b9 F* g7 I& S  }
5 h5 d3 Q1 _+ i5 H2 X7 i" E$ \$ z2 c% O' V
   private int multipleLink(int[] favorite) {) J9 H% |( Y1 I
       Map<Integer, List<Integer>> reverse = new HashMap<>();- ~! }2 g% e. M" H+ F
       for (int i = 0; i < favorite.length; i++) {
$ r+ c; B5 n' o6 V' ~5 f% O           int from = favorite[i];) B0 {: b8 D( j8 k3 U. i$ C
           int to = i;
0 ^3 l% f7 }. F4 U8 Z$ z2 @; q           if (favorite[from] == to) {
/ S4 _- X7 E& U7 j6 [               continue;5 X5 A2 H# t. Q- N; z
          }
; P( H2 Q8 l! L* \* [$ o           if (!reverse.containsKey(from)) {7 t7 ~7 G0 n  p- ?
               reverse.put(from, new ArrayList<>());
6 T8 x* _6 j2 @9 U: M* o6 f% F          }1 S+ W  n9 r  @: d6 L6 Y$ ]; m
           reverse.get(from).add(to);; H8 y. a& ?# |2 _; ^$ H
      }, m9 `+ v& W: w/ y4 Y5 j8 L
       int result = 0;
1 x; b4 z  d) z$ _. G% R       for (int i = 0; i < favorite.length; i++) {
+ R7 [: O9 O; w& a( g% c           if (i < favorite[i] && favorite[favorite[i]] == i) {' f5 C! j# c4 S) J* G6 R
               result += maxLen(i, reverse) + maxLen(favorite[i], reverse);
6 g+ d% V- ]2 z5 m9 Q7 _7 Y          }2 ~; x8 K) n, G, F6 z
      }
& p% [' f( v0 Y% |: J       return result;6 v5 i5 I) w# S0 R6 Z! A
  }
( d3 U, T: C0 e; {9 t% c* l, s. _  H/ N: K, Y, Z5 B2 X5 F& Z
   private int maxLen(int start, Map<Integer, List<Integer>> reverse) {
3 p4 c+ Z/ ?+ L# G6 r2 P- d5 \       if (!reverse.containsKey(start)) {, c7 v; i  y; f  {3 t/ ^7 I
           return 1;7 C* ~4 ]9 }4 b
      }, I4 I5 K: k# ]# X" N9 {1 }0 j3 Q9 ^; A
       int max = 0;& v/ [% c, z" `2 m4 l* j
       for (int next : reverse.get(start)) {
) b& t  q: c0 ^8 b: D8 |" I+ F           max = Math.max(max, maxLen(next, reverse));9 X* p  T' L: u$ k: F& ~
      }
% z- |- S! @1 g7 Q6 \       return max + 1;
1 F* h! x) u8 V' b3 j9 I  }2 \6 \/ U" o" G+ R
& z1 T  P" o! w( n+ l) r
   private int maxCircle(int[] favorite) {
. U+ r% I3 z3 S, L       Map<Integer, Integer> step = new HashMap<>();
1 H; ?7 f. l/ E& n       int[] max = new int[favorite.length];
: S7 \; F( k2 {9 p6 ~1 I* h       int res = 0;  H1 {4 f9 F/ ~' \1 i: C
       for (int i = 0; i < favorite.length; i++) {/ n  b1 d; P1 p% o( g$ l! b* a
           if (favorite[favorite[i]] == i) {
" y5 S, f2 ?: E+ ?  g$ M               max[i] = max[favorite[i]] = 2;- f1 H2 _/ q2 {4 e' i4 {
          }, q( q8 l; u9 f2 S
           if (max[i] == 0) {2 S, }; Q- ]8 u4 Y: ]. q
               step.clear();
* x! J& k" Z5 w% O0 ?; \               getMaxCircle(0, i, step, max, favorite);0 F' G6 X. h# c7 f2 K
          }9 {$ ^/ a6 p2 T; O
           res = Math.max(res, max[i]);0 F% t7 I8 w- f
      }
$ D- D6 W7 A/ Y& c7 _$ H( k4 k       return res;
% _( \  D5 |; d, z  q  }8 V. [* `$ l  [

" y* ~, w8 s- ^4 z  y* s   private void getMaxCircle(int i, int cur, Map<Integer, Integer> step, int[] max, int[] favorite) {7 L& E& q5 _* X1 N7 Q' |8 f
       if (step.containsKey(cur)) {. c( Y% i& k( j
           max[cur] = i - step.get(cur);0 h2 I, ]% Q/ }0 z- p! C
           return;
5 I6 u8 W6 _# p2 w6 j7 f1 u3 V, U      }& s) S- \' @, i7 l  H9 S
       step.put(cur, i);
4 l- @5 i' ^! k1 `       int nxt = favorite[cur];
' P8 W  k* D# D! H       if (max[nxt] > 0) {
' P/ g+ r1 H% h4 B, g$ q           max[cur] = max[nxt];" X1 Y/ F! }3 B4 X% J. N- d
           return;, E1 V! T' n1 g/ ~
      }! }/ k' u" b, h, a" [6 n
       getMaxCircle(i + 1, nxt, step, max, favorite);
) Z" ^. |7 F& _9 D+ u6 }4 i       max[cur] = max[nxt];- J; l4 ^: L# V
  }$ a" {2 j5 S# ]7 ^& D, y0 V
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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