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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】
4 t  x' v: @; E4 N/ U) e/ j+ \6 C4 p* W  w8 k, f" B2 s
解题思路1 E: v7 Q- {. g# [! p' k
签到题,使用一个 LinkedList 模拟即可。
+ r( s, P2 }' o" W$ a
7 C; V$ s  F" H: n& |; w代码展示
& }  v1 o1 h3 b7 D) Q6 c9 Y4 O. g9 W
class Solution {, f3 A9 X1 f! x$ b& Z; s: ?
   public int timeRequiredToBuy(int[] tickets, int k) {. i+ X1 d2 k& a; J
       LinkedList<Integer> queue = new LinkedList<>();# o3 y0 J+ K. t. `3 `9 V
       for (int i : tickets) {4 l' y- z+ r9 Y6 R2 S
           queue.add(i);& S; a- Y2 Q3 \2 m& _
      }' E5 U, [/ T. g, _! P( t9 v* I  n
       int result = 0;$ N% F- j# _" V! X; y
       while (!queue.isEmpty()) {7 u# y4 Y: F- L2 B  d* f
           result++;
3 q" I$ `7 u3 j$ X5 n# l           int t = queue.pollFirst() - 1;
4 ~; y  f  {& c# X$ h7 h           if (t == 0 && k == 0) {
) @! K, M- V( @; _* m               break;
; F* ?( b3 [. [/ F          }
' j* Z, C2 r  A7 A* c- {+ a% S           if (t > 0) {
3 Q2 Q: N7 b3 W* }7 W" m               queue.addLast(t);" P9 b2 e+ [, A3 ^7 H
          }
) Y' L% G0 R8 C# Q5 ]- V! H* C           k = (k - 1 + queue.size()) % queue.size();
$ l$ c( K  }0 \9 _      }) {9 G( h+ a5 q! q/ \
       return result;& r1 F# u* D# Q' `
  }' q# s7 [" o' A1 Z0 M- v  K
}
' \7 q  e  ~9 `0 ]- {7 J0 a( U! Z/ c3 \& P; z6 G6 J5 o
【 NO.2 反转偶数长度组的节点】
" d: B; {% }! N7 Y! l
" ]# W4 Q8 Z4 ~& z* X9 B, S解题思路0 g( o6 x7 Y4 ^/ O0 Q6 ~
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。9 E2 d2 v4 Q: F$ H1 \; F0 b. r' h
2 m* p! a2 c& f- H( C1 f
代码展示
$ |0 a* u+ O+ C: b& o
% R5 }2 K/ `5 ?5 z6 U7 [class Solution {
! I" D" T6 {0 k" Z7 f% Q0 g4 J   public ListNode reverseEvenLengthGroups(ListNode head) {1 w% \  x/ Z$ t7 }9 j0 g' L' ~
       List<Integer> list = new ArrayList<>();
0 r( ?& Y8 c7 v% @0 u0 L       for (ListNode i = head; i != null; i = i.next) {
( E/ Z" x& O. Q) h4 _  Q           list.add(i.val);8 ~6 a: s# h7 ]; `6 n$ O- r1 p
      }6 q  L0 x$ Y1 g7 _# A
       for (int start = 1, len = 2; start < list.size(); ) {
& s- F: T" r' s           int end = Math.min(list.size(), start + len);
0 Q* _, V6 j7 T6 x# |. e           if ((end - start) % 2 == 0) {! C# P8 h1 G- K7 C
               // reverse [start, end)
8 k) P/ P; I# {2 i               for (int l = start, r = end - 1; l < r; ) {- w6 K3 @' Q( c% g
                   int t = list.get(l);
/ k# w' n$ C4 ^1 l9 Q' I! ~' w                   list.set(l, list.get(r));
9 {9 k$ i. a- ?) K' S3 b! b6 i9 |                   list.set(r, t);+ `% D/ N5 N6 q% O
                   l++;
+ ~5 V3 M3 l0 x: C9 `                   r--;
8 c6 F# i& C1 e% |( a( K$ L              }
4 o" a7 A/ k4 u; u$ x- h8 R          }
9 L& s. e' Y2 E- C: S           start += len;
  g; `" M. C) Z- L% X. R( `& k: h           len++;+ {2 S8 S  e  P3 n, `8 J0 S+ }
      }: ^  _: O5 j" \) ^+ y( p
       ListNode h = new ListNode(list.get(0));
) _9 o0 ^% H4 v2 g/ |  ]7 ]       ListNode cur = h;
2 u! [8 O; y7 e, B       for (int i = 1; i < list.size(); i++) {
& a- L, R' C8 B6 V3 o           cur.next = new ListNode(list.get(i));
0 ?- G# }0 E# g+ g4 Y; @7 f8 K% _7 G           cur = cur.next;4 G! U, o, {! s8 \3 `
      }
- i) y% S1 U* A2 o" M       return h;& c3 W8 T% M+ Q& k
  }2 i* u9 y% u0 i+ y* N  I( G
}) Q, ]9 L: `1 B9 T3 {& Y
' Z, u" d2 t" S- x( X" O& t/ ?
【 NO.3 解码斜向换位密码】8 l) T! h% ]/ i! [* @$ x  |
" R2 T) u+ y' e  e4 {0 H7 X. Z
解题思路
8 u9 ^) [0 f5 [5 k  z, R7 S还原出矩阵即可,最后注意将后缀空格删去。
3 g! y6 F  G& g4 ]$ _7 E
+ w3 X6 C' {. J, v+ |& T代码展示
+ h  H, `5 G& y6 Q$ q1 x9 B
# h) \! G/ T6 b, |' j, w: gclass Solution {
5 Z7 X- c  k) }5 t# F1 l   public String decodeCiphertext(String encodedText, int rows) {
1 U$ A% J! B: r5 s0 y       int cols = encodedText.length() / rows;- X7 c+ R' ?$ i& s8 O7 C
       char[][] mtx = new char[rows][cols];* b" I' Y' t, i  Z9 b8 B
       for (int i = 0; i < encodedText.length(); i++) {
3 l- P0 [/ L  Z$ L1 {9 @  L: Z. T0 b           int x = i / cols;( X3 S$ {) {. J% y/ W8 m: q5 S
           int y = i % cols;
8 M" r. G( a; O; j% z. \           mtx[x][y] = encodedText.charAt(i);
2 c% u4 U# J/ `) {/ a# R4 \9 I) {( m      }3 ?7 L) t! A$ o7 S" }- {: o) ?
       StringBuilder sb = new StringBuilder();1 P: q- n' n8 `( O
       for (int startY = 0; startY < cols; startY++) {
$ |' N: T! G1 j* V           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {
9 P( d+ k7 K9 B5 f- Y               sb.append(mtx[x][y]);
+ e8 W. `2 i$ k; z* \          }1 ^- e7 ~  D; I) M# s0 t
      }
9 \: `6 D* D5 ~6 j' O       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
* o  P  [$ O2 R1 H  r' J: V0 `           sb.deleteCharAt(sb.length() - 1);
$ ~8 [* V2 \1 E/ N9 m      }
& {( @* y& \! w# h       return sb.toString();2 _; y6 q. ]* }* B) ?2 B+ g- Q$ }
  }, R( }; q) \$ f$ C2 t( l
}# ]% s/ E6 o) I  s$ `: \) l

; v( q4 X0 A4 K9 R! ?
4 L! n) P7 g/ m" h【 NO.4 处理含限制条件的好友请求】/ u( |9 G' U! n  Y6 H/ L" d
0 l) F' V+ G; M% L
解题思路
) N4 a0 h+ X& W# k  e! Q( S! k并查集,详见代码注释。- T  t3 z: K3 d8 k0 {4 I; j9 j5 {

" v8 Q; V# V6 I2 ?7 Z2 ]代码展示
' m/ ?6 M2 B9 M' i
- o  m4 ~* w" F  U+ }1 B& nclass Solution {
% j  C* Y8 A' S& z3 e   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {' q% O7 E! c8 S$ x8 }6 J
       boolean[] result = new boolean[requests.length];& ?- B  A, P4 N* l% l
       // R[i] 表示不能与 i 做朋友的人% n! P7 q1 h! O- }. ?5 g6 q( n" j
       List<Set<Integer>> R = new ArrayList<>();
9 V8 ~: @7 [1 Q- |       for (int i = 0; i < n; i++) {
. T1 s/ b! i8 x- L+ n3 _* ~           R.add(new HashSet<>());
% L3 X$ l+ x* I" N3 H' k/ A      }
$ y% J( u* ^4 r6 Q) a/ J, j       for (var r : restrictions) {1 H8 s% u& ]2 W. X- v2 P
           R.get(r[0]).add(r[1]);
1 E. ~9 b- _2 u& g9 S5 g           R.get(r[1]).add(r[0]);# T+ A, Z( g7 m$ ?0 A3 `
      }
  |" \' S" c3 q' j: D; j       // uf 维护间接朋友关系
$ L7 e; a* s3 N, N9 i) A- S       UnionFind uf = new UnionFind(n);: R8 m, e) q1 B9 _8 K* Q: m- e
       for (int i = 0; i < requests.length; i++) {0 O! m8 _9 X( \+ Z7 j
           var r = requests[i];/ }& I6 a$ m) ?
           int f0 = uf.find(r[0]);
: V/ D0 G" @1 ?8 p1 P( }3 M           int f1 = uf.find(r[1]);
( Q: @' Z$ p# C7 c           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了! U' E) N, y3 l9 F
               result[i] = true;. t  [) g) }1 H6 W' x
               continue;
( V- m' J( j: _$ S& R7 W% W* z          }
9 o6 ]; I% G1 B9 D           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可
! t$ I( W0 X4 Z( V% d  f           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);9 A7 }- r2 l) J) k8 U) e
           if (result[i]) {
# K: [2 U, \, U) ~: x               uf.merge(f0, f1); // merge 后 f1 将成为 根  i/ B. J9 [) Z" O+ d9 |; ^: J  `
               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
9 e. Y$ z/ k+ v               R.get(f1).addAll(R.get(f0));" Q% J5 v2 b5 ?; L% y3 B! V4 @
               for (int j : R.get(f1)) {
9 b1 N4 V/ }9 z0 f2 d7 q) F4 }                   R.get(j).add(f1);
- o% ~+ U+ C! a              }8 {. n5 F8 a/ b
          }
) s( L) b5 \  ]1 ]! x9 Z9 z6 T      }
" r$ h8 v3 w( X: d/ u9 N# o  {. k3 i       return result;! w% Z& B, H: C# E
  }
0 J1 f7 d+ |7 w, ]2 W5 s}
+ r) C/ Z( o# \; P! w* p  \7 a7 G# b5 I3 |. L5 x; G6 P2 n
class UnionFind {
  y5 y9 |4 N- A7 G$ q: ~! b6 U' e: ]   public UnionFind(int size) {
" i0 ], y' _4 Z9 x       f = new int[size];. ~: @9 L4 O) ?7 @3 r4 x
       Arrays.fill(f, -1);; G7 H0 K& }" C0 w8 E4 h+ S) Y
  }9 }* O* J9 [* a+ {5 @" ?; Q' O

, r4 g8 f0 y: k; T) ~0 b+ d. Y- M8 ?   public int find(int x) {
6 F* Q8 w* Y- p. c# R       if (f[x] < 0)1 }% u  ^! A) \  a- O& O$ Z- {( e
           return x;+ Y3 o% Z, Z  _1 Q
       return f[x] = find(f[x]);
/ G& |5 a  u% K  }
- E# L' ]4 U) J
5 w' g3 ^! \/ M4 A' ]& T   public boolean merge(int a, int b) {' A6 w+ `% C  U" Z
       int fa = find(a);
5 C* D8 z: i; M! s/ h+ ~       int fb = find(b);
, m9 b0 O' Y. Z6 o/ o6 o: H       if (fa == fb)) S: v4 b$ b8 M) v6 Y1 b
           return false;- G6 w! G, ?, a5 G7 u  {
       f[fa] = fb;7 W, K  z3 A$ r) h' n( i+ L$ I0 r
       return true;
0 Z$ I1 Q3 s* ?. x  }
8 [9 E, K/ J# J
1 \$ h( s7 I! {   public Map<Integer, List<Integer>> sets() {( c# ^2 H9 n2 M0 z$ E6 Q; Z
       Map<Integer, List<Integer>> res = new HashMap<>();* b9 R# h, `2 k! P/ c; D: B* i
       for (int i = 0; i < f.length; i++) {
% ^& b! p  e5 n# m           int fi = find(i);
) l2 ]; |( K1 S: M) p  n+ E           if (!res.containsKey(fi)) {
" D$ ?, N& a6 U8 y               res.put(fi, new ArrayList<>());
# s4 X, A/ L0 n" e          }& ?2 z$ N% X/ _/ E& A* y
           res.get(fi).add(i);
* }1 D' W' V- e% w      }
8 t& F; ]# Q. _4 d  T( K       return res;
$ _& n+ G5 u- n) q6 F: @8 h  }6 G" e+ [4 k# Q. N- l. I, |
6 P, Q9 h" J: j' H. J, F& n" [
   private int[] f;' Z! M+ L$ {: Q* b% q
}5 j, j0 P+ ]" J: S+ }
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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