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

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

上岸算法 回复:0 | 查看:1750 | 发表于 2021-11-28 19:33:10 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组排序后的目标下标】
! b1 l* m! p$ I8 }4 k) ~( L0 S解题思路5 u+ Y  I- i3 E3 o) |9 |  d& o
签到题,循环判断即可。! Q, {2 j/ K3 _) M* U1 l/ m

# O3 ~- z6 p0 `& E! o0 z! @代码展示2 {  v' g9 ?1 s
8 k* G; D8 U! n8 L% |7 v* C8 a
class Solution {' i( k$ Y- L' _% o2 G; q0 h
   public List<Integer> targetIndices(int[] nums, int target) {, D& x3 q9 I6 X5 o
       Arrays.sort(nums);
9 W7 F4 }! X0 d       List<Integer> res = new ArrayList<>();; g; L) u  B$ J% h5 f, d
       for (int i = 0; i < nums.length; i++) {0 h/ W2 M% S/ I$ _
           if (nums[i] == target) {
" R' U; P! C1 l4 w9 [, O! y: f               res.add(i);  |# S% N9 f* w  N) Q5 o% `
          }2 `" U* L2 s+ Y6 E$ I
      }
" [; o# ~) x' |" Y       return res;
+ [3 l# r  M1 O5 s) h$ H9 f% x  }
- `+ h- o+ t5 t- J; E) G}+ i; X) Z3 t- U
) D- i* |5 P7 n0 M/ w
【 NO.2 半径为 k 的子数组平均值】
/ b0 @8 s6 C# V解题思路& A( t! o! R9 l5 E' u: u
使用前缀和计算区间和。注意使用 long 类型以避免溢出。
5 y: T6 L+ C* D# K/ s
/ b& v5 H3 Z7 g代码展示
6 v; V* F  }+ G
5 d# ~. X4 c* k( c' hclass Solution {
. Q: f* B. J/ }& l, _7 t   public int[] getAverages(int[] nums, int k) {
7 g, a- a0 [2 R5 ?( P       if (k == 0) {; Y0 x% A6 s: k# g# c
           return nums;
2 ]0 \; K$ N6 D6 o  ^5 K      }
  @7 M0 o/ ]. l; |       long[] preSum = new long[nums.length];# @1 f; o5 H# y; {2 m2 q
       preSum[0] = nums[0];
4 T' A: b0 ^4 @7 G2 f7 H4 u: Q. X       for (int i = 1; i < nums.length; i++) {9 m: N% a1 h2 @  j" ^
           preSum[i] = preSum[i - 1] + nums[i];1 P- w1 y) [# `. ~6 L) [) b
      }, G& L  ^$ D+ k* T9 b
       int[] res = new int[nums.length];5 E( s* m+ P9 z/ z. {) i- u" r
       Arrays.fill(res, -1);
0 T5 A% M, l' M8 @' H       for (int i = k; i + k < nums.length; i++) {* v1 N: a/ g' s# X
           long sum = 0;
- s7 @" s+ Z; H           if (i - k == 0) {
5 ]4 m6 R0 v2 K$ n               sum = preSum[i + k];
% u! ?% x$ K  r. ?! a( l* E9 x          } else {; g; o' l9 [3 B2 Z; P6 ~+ J) B
               sum = preSum[i + k] - preSum[i - k - 1];. |6 b3 _; I! k# R2 B" L9 t
          }  Z; }- l* {( c. M
           res[i] = (int) (sum / (long) (k * 2 + 1));
& U& j. e6 v0 Y' k      }
7 }$ L; k- `- s, @       return res;4 I- {4 ^3 v" b4 @( m; {7 X
  }
+ Y0 h' s- I4 k& Y2 d}
% }; Z5 Y; z! c3 q, c) P/ u; {$ ]% }/ |- u1 Y9 G+ S3 [2 _8 {- ]
【 NO.3 从数组中移除最大值和最小值】6 \; w2 P# S+ W$ _9 Q

1 S; Z9 E) C, A9 i: w  c- Z解题思路
4 U; t9 I1 }( ?" t% ^; [贪心,按照最小的花费移除即可。详见注释。: z1 r) G6 k( s% J. a
2 c! [, l9 s' N, n7 c/ M
代码展示: T/ l# _% A6 e& M1 Z; r
& E& e/ ]( K; F
class Solution {
2 s# Y% `6 b- n5 [# G+ x   public int minimumDeletions(int[] nums) {
0 n+ B: E$ ?, u1 b: G$ v       if (nums.length <= 2) {: c# {7 ^- C3 J2 {( {! X9 k$ U
           return nums.length;
2 i3 S( t- I% V% o' X% G6 a% `      }0 w7 N- Q* D, e) E
       // 找出最大值和最小值的下标,由于 len > 2 且元素互不相同,所以最终 max 一定不等于 min3 M/ F# n3 a$ z3 O: H
       int min = 0, max = 0;
) s% Z; i' i2 ]* l       for (int i = 1; i < nums.length; i++) {5 V! O2 p! b( m0 d9 W( N
           if (nums[i] < nums[min]) {
/ T1 H1 t7 \* ]* }" ~               min = i;
4 A7 q( b. Q; C+ [- B; j0 ]          }
( c/ G, i" S# D1 x* S           if (nums[i] > nums[max]) {; S, l7 H6 k( v: y
               max = i;
2 b  V& Q' B; ?2 L2 x          }9 s% A# Q$ O$ X- c0 i7 @+ f* S! ^
      }
% |8 D, A1 A0 B% [) `       // 要移除的元素下标为 max 和 min3 K' b5 W4 ^" d, h0 Q" g- [) s
       // 此时我们只关心下标,谁是最大值谁是最小值不重要
# s# K# l. h( S5 h) u7 [       // 为了方便处理,令 min 为较小的下标, y7 a, m& ^% ^$ U7 O/ x# l& s
       if (min > max) {& j& t7 h6 r8 v/ b
           int t = min;! h' \+ x0 j* K" D% z$ Z
           min = max;7 L, l' A# j8 W( P1 A7 y. f
           max = t;2 l! P  o9 }' Y( z; m
      }
" r7 r. p& u3 p" |* z) ~4 A       int res = 0;/ f; z! L4 S5 f' o. u0 x2 r
       int left = 0, right = nums.length - 1;
) S3 R* W( L9 ~  v& w3 J       if (min - left + 1 < right - max + 1) {
2 K  [/ _& \) h( F           res += min - left + 1; // 贪心,移除 min 需要更少的操作,先移除 min8 h. T6 ^" ^- O% F
           left = min + 1;
- h; E, [8 ~% i+ C* r           res += Math.min(max - left + 1, right - max + 1); // 然后再移除 max
& o( n- q: Q* m! W      } else {$ H9 o7 @' U# n5 E- [  [9 F
           res += right - max + 1;
, D" f) ?, _; V/ V7 f           right = max - 1;
( m$ X, g8 M% p* m, b% I6 w           res += Math.min(min - left + 1, right - min + 1);% u' }" j* A- |0 Q& M1 G

9 N" f% G+ l! q* _& X      }
, A8 v; r  j: j! n- k5 V6 W       return res;1 c! S4 L1 q2 e1 y1 g6 l
  }
/ W2 Q, j) G8 A3 x}
- `8 [- W% W: `' n$ @2 m! l+ {5 j2 q0 y9 i' t8 l" z% ^" _) T* h
【 NO.4 找出知晓秘密的所有专家】
8 S% O: H9 X2 o0 U& {& g& M0 A9 \% q% d, W& I
解题思路' _( [! [0 h* {5 V% F
并查集,详见注释。8 S$ }. O8 u5 Z/ [
$ x5 }' {  |: u2 x8 q
代码展示" v- U" Q8 Z. H6 ^# X
; b) E6 ]  q) S" W9 T
class Solution {* n* y, H9 V. |* A9 D% i. J
   public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
" }" o% K7 n( L/ d$ y) z) f% ^       // 按照时间点将会议分组2 t4 K/ ?5 _$ ^, e: `
       TreeMap<Integer, List<int[]>> orderedMeetings = new TreeMap<>();+ X' }  _5 j* Q
       for (var m : meetings) {2 D) P" O" J7 W, V" F
           if (!orderedMeetings.containsKey(m[2])) {- N- F, E; C0 F. }$ `: I
               orderedMeetings.put(m[2], new ArrayList<>());
6 w1 j2 N/ }, n2 j1 @0 V          }
+ w) ]0 @; U9 K           orderedMeetings.get(m[2]).add(m);
: Z& s: G/ e% g& W4 j& L: j      }
, z2 i! ^! J: V8 [' j       boolean[] known = new boolean[n];
0 p4 c2 K  m' o9 U- N+ E, y       known[0] = known[firstPerson] = true;, B4 ^; }6 \9 x4 m  A1 I% n9 x
       while (!orderedMeetings.isEmpty()) {' z8 ^1 j! G" X& q
           // 按照时间顺序处理每一波会议
( h0 U. J& E, x           var entry = orderedMeetings.pollFirstEntry();6 U0 p( H- N% O* F* J
           var curMeetings = entry.getValue();: A2 m" H+ n- x
           // 使用并查集维护当前时间点发生的所有会议中,有关联的人
5 ~1 K0 W/ t4 h           UnionFind uf = new UnionFind(n);
! q9 Z, h. b% }( p" a0 G3 c; [           for (var m : curMeetings) {& ~- Q. q& ^: c1 v! _! L" X' `
               uf.merge(m[0], m[1]);
, @2 U$ ^5 X5 r0 P          }5 N3 s8 Q& I( n' J8 V; ?
           // 枚举所有会议) Z# s8 c, r7 T8 X3 X/ b# d
           // 若会议参加人 m[0] 或 m[1] 知晓秘密/ m' S! j" y9 p3 G
           // 则把他们所在的根节点也标记为知晓秘密
8 X" w. U0 X/ A           for (var m : curMeetings) {
. K! d  L/ C% \, Z$ L               if (known[m[0]] || known[m[1]]) {$ o; A+ c# \0 M4 t3 |! \
                   known[uf.find(m[0])] = true;5 [. Z7 _! s" _/ X/ ]8 a
                   known[uf.find(m[1])] = true;
7 ?) @8 R& }& d, i              }
/ s' q$ B5 L0 `; o3 Z. r! s2 Q, \9 o          }7 o" N) n4 U% \6 T; _% R
           // 枚举所有的参会人,若他们所在的根节点知晓秘密,则把他们也标记为知晓秘密' ?$ L  i6 ~3 G
           for (var m : curMeetings) {
' w) W( L/ y/ F+ M, S. W               if (known[uf.find(m[0])] || known[uf.find(m[1])]) {& r9 }; U) r. }
                   known[m[0]] = true;
- U* {9 _/ N( I7 |                   known[m[1]] = true;7 f8 ~9 J0 t/ X2 c1 x# R3 [
              }5 M3 `2 J5 V$ }* q2 P
          }
" j2 g- g7 Z$ c5 B* F0 n      }, C4 i* ?, l! N. o
       List<Integer> res = new ArrayList<>();
) g+ j8 \- u3 T) |0 l( X4 e       for (int i = 0; i < n; i++) {/ U! Z! k/ A8 [7 h0 m. R
           if (known[i]) {
, e  O9 E) c5 C# i/ x               res.add(i);
& `$ [* b0 v( d2 @          }
4 G) m+ [3 `" s0 _, E) Z3 }" ?% H' f      }
6 {  u0 O  x/ Y8 c       return res;9 N9 q, }) v+ V' n
  }
3 j9 q5 O9 @% t2 O3 Q0 T4 w}) M* M' B  x. Y
1 D1 j+ N3 d  S7 k6 v/ H
class UnionFind {
1 r3 |" t. R2 }  v6 A' h7 E2 I( o( V* v   public UnionFind(int size) {
6 _8 V+ p. x" p+ Q3 o! S8 v; Q       f = new int[size];
. [* p% o% U% L2 s       Arrays.fill(f, -1);
7 G! u3 I1 p( r$ c9 e  }1 f" z- C# K5 z& J
/ ?. F- |4 V3 m. K1 M6 ]
   public int find(int x) {
& q8 q: _) E  @$ z       if (f[x] < 0)
/ ?  p. o7 S; q8 N& m           return x;
0 l, v6 g, f$ ~5 J8 e# [, g: ]       return f[x] = find(f[x]);+ o4 N  }3 f  L2 p
  }3 ]$ Y( i$ s& G  o* {. E% w! c
6 r5 k( b( i* K; K
   public boolean merge(int a, int b) {
2 S) n% q6 D9 ?+ J1 i       int fa = find(a);3 ~# N! e& j- {7 j1 f  I0 }7 T, O
       int fb = find(b);
$ p1 {; M* X: j: E       if (fa == fb)" [- X3 h" ^1 W* h; E6 R* a
           return false;
% b; s) F0 r) j) [       f[fa] = fb;7 s: @* I0 k* E. F7 F' s  I
       return true;0 ~6 b/ N" k2 a4 _. R7 P5 i1 \
  }' r* t8 J* v) x* w8 u

: @/ E! N1 k  f6 ~   public Map<Integer, List<Integer>> sets() {! R& h# A% l* k0 a( H7 }
       Map<Integer, List<Integer>> res = new HashMap<>();
3 _- m4 W$ |  R2 j       for (int i = 0; i < f.length; i++) {. f7 b, f7 t  q0 d, n0 T- q
           int fi = find(i);
2 l, |. I+ o7 C) R/ I# D9 x& p           if (!res.containsKey(fi)) {# T, w6 o# ?" ]+ t( Q- u
               res.put(fi, new ArrayList<>());
7 ^/ S- R& x  ?5 I( Y6 L          }! |: q: ?& X( r, o' T, l8 S6 d1 l
           res.get(fi).add(i);
9 n" O1 r; e6 \. O0 z2 o7 s      }: c  f2 a  i8 L7 T# M
       return res;
0 J; E- m# E0 U/ n- p4 N  }
3 |( q2 W% b* O+ j$ r6 Y5 j9 R, ^% l1 P5 A) h# I$ a$ e  |
   private int[] f;
8 j) S+ i4 C3 Z8 d2 d}+ O5 ^% |  t# I' T# H" E$ Q) D. a
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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