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

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

上岸算法 回复:0 | 查看:1534 | 发表于 2021-11-14 17:02:13 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】
2 S# U" p0 R% n* z, n9 I- _7 z2 @% l4 Y% h& [- s% g1 H
解题思路5 v2 e% q$ _. X$ D: ]
签到题,使用一个 LinkedList 模拟即可。% F8 Z6 G4 W" ?8 c) K

- ^' ~* U$ Q& B/ \2 c' p代码展示0 d1 _  k, S- f5 `' F
. j0 ~, |3 d% [$ y8 M9 l
class Solution {
- G/ r- x9 G9 \5 b, k   public int timeRequiredToBuy(int[] tickets, int k) {
0 a. ~0 x. g% O       LinkedList<Integer> queue = new LinkedList<>();
2 V9 ^* C1 \2 ?) K5 E       for (int i : tickets) {
) L. `) e5 H* F; C+ s           queue.add(i);
* B7 t/ z- e9 R      }4 W3 K4 m& ^3 }5 c1 C' C  l
       int result = 0;
' ~' T! T, N+ J2 j; w       while (!queue.isEmpty()) {& w9 @% Q% t+ K+ M4 d  E' r$ @, g/ C
           result++;
1 O, J  \, k! J% g8 k* y           int t = queue.pollFirst() - 1;
$ r; J: y" T0 ]9 a3 N           if (t == 0 && k == 0) {
  ]) n! N" S. @/ n2 S8 {$ `               break;1 _! V" s' d" n7 P' b
          }# v& {8 r0 J# s1 `8 A
           if (t > 0) {
" u2 e6 A) l- {% Q0 X               queue.addLast(t);1 K$ K4 t2 P4 N) A# q, ?; g
          }
! X6 [6 D5 t7 Z( n) ^' x; X+ k, g9 m           k = (k - 1 + queue.size()) % queue.size();
0 W7 T7 h* c2 m% z0 w, {% b8 T. j      }# V8 s! @0 h+ Y, e) E; B5 `$ m& f8 c
       return result;* |% F7 q% h+ r$ {/ H; K
  }
) }2 p5 _  y- E" X/ |}
! @  P% X) \2 x7 |. q
& c9 g& d9 C% @: |$ J7 y0 N8 C: C【 NO.2 反转偶数长度组的节点】
# Y  Q0 X) f. d9 J
- F2 \4 A5 B" e4 a3 W7 Z解题思路! C7 n/ N7 K- @) l3 h* |2 c* F
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。% A; V$ b% S( M' b! E

' y1 C( v# s6 y6 s代码展示$ X' I: G% u+ a. F" x1 {+ H
" u0 S4 X3 ~1 d& j- e
class Solution {( M, C  g  u/ g  ?4 i+ O6 C
   public ListNode reverseEvenLengthGroups(ListNode head) {- i  W8 u3 a) W
       List<Integer> list = new ArrayList<>();' U6 D! w8 l- t2 }
       for (ListNode i = head; i != null; i = i.next) {6 E& D3 G. E' m5 I
           list.add(i.val);; l9 q  u4 E, y; F# ?  t- G0 j
      }: x% I" `. T' M- F6 C2 m& @, c! h
       for (int start = 1, len = 2; start < list.size(); ) {
8 ?3 y, Y+ m) B3 x8 p& G           int end = Math.min(list.size(), start + len);
3 n* H8 ?* ]1 b3 E2 e( H           if ((end - start) % 2 == 0) {- B! p2 ~/ H5 {2 [4 u; t7 y8 S
               // reverse [start, end)& W, n/ J' Z" Q
               for (int l = start, r = end - 1; l < r; ) {8 S, J% Y& x" o' u% w+ L' ]: W$ P, M: \
                   int t = list.get(l);4 w5 P2 x) b5 e8 O9 h
                   list.set(l, list.get(r));
$ B0 ^0 I1 ^! N7 p* m                   list.set(r, t);
/ g. g) |2 h3 I' Y7 h. A$ O4 j                   l++;
2 o, G/ d, V3 Q# w                   r--;
2 I, Z% S1 _+ ^6 J! c              }) O- j/ w6 a' _4 b' W  ?. ?6 R+ ^, X! b
          }
3 k/ `: `3 _9 J% }/ W           start += len;
1 s; T2 ?& g: q) z           len++;
8 Y3 P6 E' N& a$ \; |# `      }
. n" o6 C8 K: F  U4 P4 @       ListNode h = new ListNode(list.get(0));: G  G/ L  [" _% s
       ListNode cur = h;5 A( D. J+ b7 a3 P+ E; X' }- E
       for (int i = 1; i < list.size(); i++) {8 y  F* M* Y) R/ F9 b: V+ a
           cur.next = new ListNode(list.get(i));
( }1 P% h( ]: U7 _% i6 V: O           cur = cur.next;
7 x' S/ a# E  ?( K      }
# @% g7 D( D0 L* f% {8 _) ]$ l       return h;9 R# t  w" R2 N9 t* a, d& O% E
  }
0 U5 [2 v& Z* E# |4 S}$ ]6 t; p: {/ `) X' p) d: }

# D% ?6 l8 @8 g【 NO.3 解码斜向换位密码】
% y- w# E1 X  v$ g" {  O
4 L/ K( I8 ^. D" e. |; s解题思路
) O( h5 t1 b7 H* n还原出矩阵即可,最后注意将后缀空格删去。  B: Z0 K: b$ N+ L% k) l& b( Z) r' W1 C
5 q% @5 z) R' T3 A+ e) }0 z7 s
代码展示
/ r+ \* L( i: a) S5 H/ |2 I5 A, L
& Q2 {' _+ r) d0 {5 [5 Mclass Solution {
, Z9 h# P& q9 F; ~8 x- m   public String decodeCiphertext(String encodedText, int rows) {
. v: `, _1 A0 e( B9 A; C       int cols = encodedText.length() / rows;
0 h, x' v/ U+ k. f& `( h/ r; X       char[][] mtx = new char[rows][cols];2 `) X$ V: k/ l4 c5 c
       for (int i = 0; i < encodedText.length(); i++) {
+ Y6 V0 ~2 Q; M4 }           int x = i / cols;% G3 Y6 W" f5 x  n$ N
           int y = i % cols;& p. y9 P! K9 `6 [2 p& {
           mtx[x][y] = encodedText.charAt(i);
4 H. v. |, ~9 t" z( v& q; M- Q9 i. ?      }
7 i$ k- D5 ^9 Q       StringBuilder sb = new StringBuilder();
- ], o5 ^3 @0 T( d9 T6 j8 g       for (int startY = 0; startY < cols; startY++) {5 C% j7 `3 p' x  P$ C2 ]/ V
           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {
7 e3 M9 J5 W/ ?2 ]5 l               sb.append(mtx[x][y]);. r4 f, J- [) r7 [
          }
: A5 a' ^7 W- r5 N# G9 x2 w      }
8 ~+ ?. a9 l* O) s  G/ r7 X, {       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {. C! I+ D1 i/ O; y# i
           sb.deleteCharAt(sb.length() - 1);
+ g  |$ ~3 F. a8 _0 {      }  D1 `# V' {( e
       return sb.toString();& f: m$ y2 t, J
  }  |/ c6 n* J3 F, |' `4 G/ {
}& z& e  Q9 _9 y# G4 m" f
* U/ @- b3 }" e0 U5 c* X
3 {  h/ k0 i, ?/ D5 q) J( x1 r/ c: O
【 NO.4 处理含限制条件的好友请求】3 B, }% Q4 M3 q/ s, q7 |3 L  ]9 B

3 E& y! m' r! c+ u' i( R- g7 y解题思路, \; X3 J2 a2 s
并查集,详见代码注释。
+ `7 S6 n- V6 o5 m% C9 j: m9 i( L$ l  X2 L% s9 I  L- a8 k
代码展示) T3 R& M4 `* w) b  Z3 R& j$ z
, C1 q* C6 }& z! ^  |/ p% H
class Solution {
1 T( B/ {+ z' T$ L  P0 E6 f/ T+ W0 y   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {3 D3 K; j. _9 S, d6 i
       boolean[] result = new boolean[requests.length];2 e# @! ]3 _1 M
       // R[i] 表示不能与 i 做朋友的人
! y$ a, M8 l( t- j       List<Set<Integer>> R = new ArrayList<>();
! J! n2 r5 C3 {% k, l5 W" Z       for (int i = 0; i < n; i++) {3 H6 z* w2 L7 U, D% T
           R.add(new HashSet<>());2 W7 `2 q' ]( m8 K- |
      }& P- V) Z+ K6 D  ^6 ?1 p
       for (var r : restrictions) {
# E# s+ J8 c2 I  e           R.get(r[0]).add(r[1]);1 U1 ~" Q7 m! n! G
           R.get(r[1]).add(r[0]);
7 i# O( i, e3 N5 G6 U6 c$ f      }
' ?. [- W+ X8 r7 h3 K. @$ \' V       // uf 维护间接朋友关系7 j" q2 d: t1 q" B( o
       UnionFind uf = new UnionFind(n);, c( p% {8 t" u% ~/ J, T( |4 k
       for (int i = 0; i < requests.length; i++) {
6 q% V6 V$ C$ K3 Q           var r = requests[i];
* r/ @! c; v( I  l+ ^0 j& ~$ ~           int f0 = uf.find(r[0]);' o1 ?( R1 w8 q% I
           int f1 = uf.find(r[1]);& o  S( t9 z# g2 K$ z6 k
           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了
" L; e" o9 y8 e7 O               result[i] = true;
* ]5 i9 r1 {% U5 {( A) ^               continue;9 B) z$ j8 O* O& l; v" I. s
          }3 Y3 `" D1 n! T( f/ L1 Y& c) Q
           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可% r+ q: b. G4 M
           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);  D5 }# ?) z; M4 x2 O, p
           if (result[i]) {
4 ?' @4 ?( Z" m' \               uf.merge(f0, f1); // merge 后 f1 将成为 根/ ^/ Q" i, }) P0 ~4 n. j3 v
               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了  u7 |: {/ w: r+ B( x. B/ U
               R.get(f1).addAll(R.get(f0));) ?+ }. P! P4 j$ Z" L
               for (int j : R.get(f1)) {
% D* O- i. r7 o* ]& o                   R.get(j).add(f1);) L$ U; c4 w$ P5 B4 e2 R
              }
$ L9 f1 |, C6 c          }! f$ L$ I& t* l+ v
      }# b8 C. P# V0 L9 D
       return result;0 [% g: i# r8 L$ @8 ]: X, U" J1 h
  }
) Q' p9 _2 F) n}4 E0 c. q' L/ c. r7 E

# B& y4 c: A+ ?# [) {3 pclass UnionFind {4 _6 j3 ]6 p6 E/ i
   public UnionFind(int size) {' ]% T9 O( m4 g, g5 p
       f = new int[size];3 J, v" B' K9 ], e8 A4 {0 ?
       Arrays.fill(f, -1);1 w6 T9 Z  |3 Q- p* O0 P
  }- u0 I+ T) o6 N, ]5 K5 f/ [

4 c% E0 q% w0 W   public int find(int x) {
5 T: I' H/ H0 Z& j' v! V# m9 ^       if (f[x] < 0)8 N( g, A# m0 z: L2 G
           return x;
5 d, v# B5 W9 Y8 J- O" s0 G       return f[x] = find(f[x]);# d( P! |! P/ w0 I8 H1 u
  }6 }9 R' n6 h" c$ r$ S' o+ `' ~0 p( U
/ Z& w( _5 V% a. r+ a5 q! Y4 q
   public boolean merge(int a, int b) {( `% L  q$ Y1 t! n: ]3 u$ z
       int fa = find(a);
$ n0 k+ n9 R( c) j" e7 L: C6 }       int fb = find(b);
7 E$ `! c) S2 l       if (fa == fb)
; Z+ H0 |7 a0 w- T, F1 ?$ I           return false;7 a% L, v' l! {8 g
       f[fa] = fb;
! v' P" x) K7 e+ y       return true;
; ?" |% Z7 f+ X" P4 M2 O6 Y  }" t% T4 }) a3 S; c

: W) w/ z/ E& j8 _# y  T2 i8 x( g   public Map<Integer, List<Integer>> sets() {
$ s7 i6 J) W2 z$ y1 l       Map<Integer, List<Integer>> res = new HashMap<>();6 g" Y* p0 Z( F' N
       for (int i = 0; i < f.length; i++) {/ N8 D% X1 u, g9 S/ r; U/ d
           int fi = find(i);
3 d9 g, M% J+ K2 x, [$ J           if (!res.containsKey(fi)) {
. o( r# h. N6 Z1 B/ E) L) ~( H               res.put(fi, new ArrayList<>());4 r2 P# K! u$ i4 R/ E7 O5 N) ?
          }! c; e* c, R# ^" [6 R
           res.get(fi).add(i);
% U6 A4 e* C& N& Z- ]' h# U& L/ s  f      }! G( I7 m5 N- G$ U% N  W1 Z$ H
       return res;
; N9 r4 L- C$ Q/ [$ g1 B$ Y: A  }
. u6 J3 O4 b- q- b3 ]# S  C9 G5 ~: W
   private int[] f;8 y4 j; `: U4 @5 S8 S8 W) N
}
" L, \! T# p9 I3 d& D2 j1 l
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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