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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出数组排序后的目标下标】
8 x4 q. X. |4 T; H, t; U7 [解题思路
5 O& g5 t7 J+ X2 d# p签到题,循环判断即可。
% Y; U: ?5 I' K( b, J0 I
- x# n2 [0 I& C3 ~$ _' `代码展示
$ i1 a6 Y3 Q  j$ }' [6 p: l8 {* h. e9 N  B+ Q3 Y
class Solution {9 e* Q% b, I; }  b
   public List<Integer> targetIndices(int[] nums, int target) {6 I3 F) B4 J" n! r. a" m' M
       Arrays.sort(nums);
1 Y. s+ ~& T2 L& U& l5 l8 l       List<Integer> res = new ArrayList<>();& [0 Z0 O7 _/ A
       for (int i = 0; i < nums.length; i++) {+ ]9 @: g' w/ ?0 n. E
           if (nums[i] == target) {( _0 O" B  J4 `! T$ R
               res.add(i);
! s9 t- m' g7 L6 a& n+ |          }, }, P8 J% Z9 l4 e5 ~: X/ C
      }' n9 G* v' P0 V' `
       return res;
+ E' n/ M+ G" o4 M  }
# d2 I# \8 n& [1 g8 Y# ]}
" y; J6 a8 q/ {, d+ O: C) R
& J3 _1 j- G- P. C- F- k' ~; }【 NO.2 半径为 k 的子数组平均值】
; v5 K+ J- t# G, ~解题思路
8 j5 X1 z7 c0 @; X5 a: o使用前缀和计算区间和。注意使用 long 类型以避免溢出。
- G3 _; `5 a5 {! r+ n) o$ B+ H6 B3 W: M5 Y% G& s
代码展示
# {6 T- K% o- n% ]6 I
8 O& Y& `$ C  Vclass Solution {
0 e+ {$ R6 i1 e- x8 K4 x% v4 T; ?   public int[] getAverages(int[] nums, int k) {9 r' g/ W1 M& b) W* t0 F# S$ l  P
       if (k == 0) {
8 ?, Q* @' H) H. k5 i8 \           return nums;" V" k; k1 K- b) w3 ^* k
      }
& D/ H) }" m( W' y       long[] preSum = new long[nums.length];5 J5 s" J5 }! G0 L5 c
       preSum[0] = nums[0];" j$ T* Y8 x' F. i% u* T* V
       for (int i = 1; i < nums.length; i++) {
6 V, Y& r* G$ \# O4 p# J' g" Q           preSum[i] = preSum[i - 1] + nums[i];! g+ S. z: J4 u, B5 i
      }
" K7 O6 H* G. L3 _* k       int[] res = new int[nums.length];
( v  Q+ Q. t: Q" ~& c% x/ n       Arrays.fill(res, -1);
9 W% k0 c9 ?% I, _% u, v- @6 z/ x       for (int i = k; i + k < nums.length; i++) {
# J: d: J( C2 N8 z  i           long sum = 0;
& O* T7 w$ o/ f& w9 }           if (i - k == 0) {' X: v' l. [% f
               sum = preSum[i + k];$ U  M& D# N+ y6 a
          } else {# P1 E8 j! z. e' d# d: V" m6 _
               sum = preSum[i + k] - preSum[i - k - 1];
. j: V- Z3 X) ?7 r) m' f7 e          }
3 p6 b6 t% r. u  ]9 m4 T           res[i] = (int) (sum / (long) (k * 2 + 1));
2 j5 k9 V) v. n1 g( o9 k0 ?      }
! X& j1 T  g$ x       return res;1 O% E: i" o5 |+ r
  }2 N, I3 a: {7 U
}3 \; f7 _  G" P7 P: V

/ D. P$ }* `# C% b( ]) k0 }: P7 \【 NO.3 从数组中移除最大值和最小值】
# l' e5 F, S  s, ?) y* c* \$ L
/ `. a& L5 f! u& T解题思路
" q* W% \/ H5 t! M+ L: z贪心,按照最小的花费移除即可。详见注释。
  q4 Z, O, O3 s- ]) K$ L, J( a3 C8 i
代码展示
" `% b* w5 s- x& }, g" x5 n
1 r" _) n: ]9 V! Nclass Solution {# n' P. o! E' q; u# f, X5 V; i
   public int minimumDeletions(int[] nums) {4 M( M9 T3 X! w' R* S
       if (nums.length <= 2) {
# U' w) s4 E% [: E           return nums.length;+ g( x3 w" D7 }; j, A
      }. S, \& i$ @+ C/ ^) r; w
       // 找出最大值和最小值的下标,由于 len > 2 且元素互不相同,所以最终 max 一定不等于 min0 k0 A- ^/ q$ o1 c; {
       int min = 0, max = 0;6 X' c- m1 b3 {; q# N% Y
       for (int i = 1; i < nums.length; i++) {
& u7 o4 u+ U- x3 }. u- }! g5 X           if (nums[i] < nums[min]) {
' B8 ?1 I' t; J& i# g( w               min = i;
% y# Y+ b. v% |5 @          }
0 v5 m9 n" D5 r- g7 T           if (nums[i] > nums[max]) {
  |* j) h1 j" R3 Q               max = i;, K2 @: |3 \, Z& _- s
          }
$ ^. v! Z5 _! b4 X. J      }. [: s( n" P. q) B
       // 要移除的元素下标为 max 和 min$ O' S( R5 o' e0 t
       // 此时我们只关心下标,谁是最大值谁是最小值不重要
/ z! A9 x9 X& R9 L' r+ ?" [       // 为了方便处理,令 min 为较小的下标9 x3 P! E. w9 F& n& E4 d
       if (min > max) {6 s3 J% `- h% M7 d& W
           int t = min;
- I$ |; L5 z$ |0 s' r5 a0 m* m           min = max;" i2 E2 n# S2 x  Y
           max = t;
) r' D( e& d- y8 N* s7 [! s      }5 i: x( d- L' ]3 K4 H8 q- J5 f
       int res = 0;
5 y. Z, i1 e9 E# f( R* e       int left = 0, right = nums.length - 1;: D& P, U9 S5 V# G4 q) k. S
       if (min - left + 1 < right - max + 1) {7 t) v8 d+ x' Z0 n
           res += min - left + 1; // 贪心,移除 min 需要更少的操作,先移除 min
' n/ S6 {2 C! h% N) b           left = min + 1;/ h7 {* A4 n( ?  R; _. u3 }
           res += Math.min(max - left + 1, right - max + 1); // 然后再移除 max
7 C3 T6 b) _3 r      } else {" `" X4 Y& k: z( B5 x* ?
           res += right - max + 1;: o; q# A# L' c+ }# n
           right = max - 1;
1 O& @0 l: W, v1 f           res += Math.min(min - left + 1, right - min + 1);4 g) L# ]: D3 p( T0 c9 J7 R

. C1 _8 M+ N  ]! D0 A( o) I2 M7 C' v      }4 Z/ q$ k. P; t* h! K
       return res;
' @2 J- l" {; H! g  }
0 }* c1 x2 z, V: a}
! C8 n" z9 y. D4 ^8 w! g, V! n! u$ h
【 NO.4 找出知晓秘密的所有专家】
3 [; \8 @! v6 |( y6 b# X4 q, I7 U" r  t
解题思路
5 ?6 t( T6 Q/ ]9 S& @8 y并查集,详见注释。1 B# z/ g1 u0 K$ v1 h. p

# E+ `( d4 u( @. K+ [代码展示
% w8 C$ [* K: x+ z
7 {* X% i1 x" D5 p& p( c. W  [class Solution {* Q9 Z+ _& D. x. n
   public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
: x5 U& l! x. F       // 按照时间点将会议分组
; J: \) F& T. G2 ]       TreeMap<Integer, List<int[]>> orderedMeetings = new TreeMap<>();/ Z7 g& {/ \+ Q) q
       for (var m : meetings) {
) t2 p: s* R( M! i: C           if (!orderedMeetings.containsKey(m[2])) {
8 _3 o( b: }( f% @  O6 P               orderedMeetings.put(m[2], new ArrayList<>());
4 P  J' m! ^* Y. D8 u          }' X3 `4 j- G/ [  r' [9 q* m/ p/ u
           orderedMeetings.get(m[2]).add(m);) v) H5 t5 ?# V
      }0 W: a* V  P0 H$ }1 e
       boolean[] known = new boolean[n];
" [: {: S( u# U9 R  Q* m. @       known[0] = known[firstPerson] = true;" I1 s0 g# l6 l9 l
       while (!orderedMeetings.isEmpty()) {
& N" }4 J1 n# R6 T5 @           // 按照时间顺序处理每一波会议
( e+ e: w3 ]1 i           var entry = orderedMeetings.pollFirstEntry();+ R  D7 j. z" a+ R5 l. D( N# U
           var curMeetings = entry.getValue();
. S, }, J$ a" m6 G% f+ W4 O% I  u           // 使用并查集维护当前时间点发生的所有会议中,有关联的人
0 i  d' `/ i; t% `9 w           UnionFind uf = new UnionFind(n);) x8 [+ P7 Y. x
           for (var m : curMeetings) {, m/ i3 j6 B/ i5 E) E
               uf.merge(m[0], m[1]);
! L: f* A2 R! u          }! C& l4 j$ O! @/ Q3 g
           // 枚举所有会议% a, S& Y( F- d; g" X+ \
           // 若会议参加人 m[0] 或 m[1] 知晓秘密
, V8 ~) c& M/ u           // 则把他们所在的根节点也标记为知晓秘密
$ e# P( S2 P$ q& E* Z           for (var m : curMeetings) {6 U' b( |5 q2 |' N
               if (known[m[0]] || known[m[1]]) {
& x- x! k6 Q' ^: Q0 V                   known[uf.find(m[0])] = true;
" N$ [9 t; P  o                   known[uf.find(m[1])] = true;
: N/ d; m$ P  ~: F              }9 s. |. |$ Y8 R2 P4 h4 ]0 I# w: @
          }
$ n& e8 Q- {/ k- M' J2 K0 S           // 枚举所有的参会人,若他们所在的根节点知晓秘密,则把他们也标记为知晓秘密, r" q0 Y% M8 y3 H9 m- p: M
           for (var m : curMeetings) {
4 ]- y/ \, E" o$ Q  Y               if (known[uf.find(m[0])] || known[uf.find(m[1])]) {
! j3 A0 m7 K9 p) d0 Z                   known[m[0]] = true;
+ M7 Q7 t/ i" d; A                   known[m[1]] = true;
0 b2 e5 l8 l1 S              }
& X3 R9 p  U% i6 T          }
0 _  ^: y. t: A3 A8 \      }( h, l" T4 d: S2 m4 S
       List<Integer> res = new ArrayList<>();
/ ^3 S) h9 t  }  p: M6 H3 T       for (int i = 0; i < n; i++) {
$ l6 I. f7 p0 B% ~+ \- U, T; O           if (known[i]) {
. x5 z! J: n0 C' g& |               res.add(i);
. y6 W/ v5 g: N, c          }/ Y* L+ B9 \  l' l; u5 l% d7 E
      }# N( z# @% h5 Q" w& u/ H0 ~) \
       return res;
* G. r9 P9 z; d: O. I1 Q  }4 {$ V# x  j8 P
}
' s$ \6 K2 j! V- m; o
/ x! y+ y9 S5 x0 y* Y& ~* Jclass UnionFind {6 J3 S9 V, r2 y/ B. Z9 u: C
   public UnionFind(int size) {
. ~1 u" k7 t3 z$ a% q       f = new int[size];3 U, R" O' _. [5 G3 {* K
       Arrays.fill(f, -1);4 u! \/ j, j& K8 J8 j* R
  }3 a4 C, h% w- p  A

1 R  i" d+ U) N$ Y) g   public int find(int x) {" L' b4 m9 }5 E& M
       if (f[x] < 0)# w5 }2 J. y8 L* M1 s
           return x;+ g2 z* M! u. h6 Z& x1 B
       return f[x] = find(f[x]);* v5 e- a4 h0 h
  }! T- N8 [+ g/ e( f/ w1 {( V

- g* y5 s' L6 n  L( z; v   public boolean merge(int a, int b) {1 P! V7 ?' b. L$ A' D
       int fa = find(a);
" {+ n9 X, e6 U8 s       int fb = find(b);
" ~; G; C. ?3 p0 O" t6 z       if (fa == fb)
9 h3 G- d+ r* R1 |! P% g           return false;
3 G" Q( W( A7 f3 Q/ u5 b6 z       f[fa] = fb;) B' v) k0 M& o+ h* O3 r3 S9 R0 b, ^
       return true;: Z8 N. p! l4 p" b. W2 g& @: G
  }# s: I' W: F8 |

  g' ~! d& L2 n+ W   public Map<Integer, List<Integer>> sets() {; z- F: E: O) m  |9 r, t
       Map<Integer, List<Integer>> res = new HashMap<>();) r- ?1 ^- ~* r$ T+ |9 l; Y
       for (int i = 0; i < f.length; i++) {
8 x7 h* l2 C; c' \6 z: {% \( Z           int fi = find(i);. R8 @. [2 }* c4 a# m
           if (!res.containsKey(fi)) {; l* c' a: l4 |3 j/ T5 p
               res.put(fi, new ArrayList<>());' a5 c% I* C6 w2 d8 c, B
          }  L% W( x; ~) _' j. {% U
           res.get(fi).add(i);0 q+ h* l6 S: x, d' Y  S+ c
      }* H  j1 }3 d$ ?2 N
       return res;
, }1 }1 w6 u: S. V4 a, Y2 J* h% Z& O3 s  }
- J. P; k+ p( B3 J
3 Z5 c5 H: G; ]& ^) [. c   private int[] f;4 }: H  [" B2 t2 X" p& T9 M
}
( y& U3 a' e- g" C+ x3 M
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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