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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】
. ]8 r4 Q% J2 X/ v3 f2 S& u/ ~7 D
! B" Y1 o8 a7 H. T解题思路
# c' \& o& |! s+ T6 Z签到题,使用一个 LinkedList 模拟即可。
% d) Z9 i3 Z8 m( W! P5 i: R+ L4 z: U$ R0 x
代码展示
: C$ O! l" a0 Y& J
; W" l; r. J1 M7 [# x) ~class Solution {
( }, |) f- Q; E1 k( `9 k6 M0 q   public int timeRequiredToBuy(int[] tickets, int k) {2 N6 C3 Y' l7 R( j
       LinkedList<Integer> queue = new LinkedList<>();
; F: H& ?  B; c3 J& J- H       for (int i : tickets) {, q1 A% {# r- z+ O$ Z
           queue.add(i);- E/ ?( q& R* |0 X0 a0 ~
      }
6 m6 b- E- Z3 s8 I       int result = 0;! q" g0 c7 g' f# ^$ M/ z3 _' C8 V2 e
       while (!queue.isEmpty()) {( Q. @& B, S' T/ M% _
           result++;5 j0 w/ ]& _" z0 n% ]; ^
           int t = queue.pollFirst() - 1;
7 A% k7 `) L2 H           if (t == 0 && k == 0) {
8 \8 t7 M3 f, w( M1 _$ z4 D) k" W               break;' r! G) R2 u: @5 j7 [) E. I* g
          }7 T& l" m# Z/ [; L0 v
           if (t > 0) {3 X- @( i3 N& ~" S! p8 f) l
               queue.addLast(t);
$ K" y$ o& S* z0 ?& T! L/ T# V          }
5 [8 `/ X) Y# v9 ?0 `' I$ G           k = (k - 1 + queue.size()) % queue.size();+ v0 d# E4 S1 s2 m* N# [3 S9 w, ?
      }! `  z9 D( k! a: Q. Q8 B% [
       return result;. h/ {, q  d' i; O  `' q
  }) K7 d3 B% l" Z
}
: o2 c( E) d$ k7 |
2 r+ H+ i# C* b, q! w2 e, ~0 Y【 NO.2 反转偶数长度组的节点】
, h. s* C, e4 @/ o% @1 }5 D3 G# W. E: `/ r5 e4 m  r$ O  j" _4 p
解题思路
0 w8 Q$ u% d( @+ S, b数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。& R8 _; m# v; @2 C; e& [! M9 t
. R- N: u) s9 e' j
代码展示" A2 |! U5 U5 e+ H2 j0 f

" x+ f( _8 j. j8 R1 \6 G! ?* xclass Solution {" k8 n0 @! ^+ Z
   public ListNode reverseEvenLengthGroups(ListNode head) {
1 j. J4 ]" N/ j" e0 D& B9 f       List<Integer> list = new ArrayList<>();
  L+ E4 \! C$ r       for (ListNode i = head; i != null; i = i.next) {
' |. O) q$ d5 K4 b% r           list.add(i.val);
6 j: Z' B, F3 n( Y2 ^      }# Z7 B/ \6 K- c: A( Q1 s/ X
       for (int start = 1, len = 2; start < list.size(); ) {9 g, z; R% }6 ~/ J9 c
           int end = Math.min(list.size(), start + len);
. k4 E7 i! J. C6 g! V* _- [           if ((end - start) % 2 == 0) {) o# j7 Z$ V$ j/ ?. \9 Z
               // reverse [start, end)5 S5 s- c3 N" \/ C; `
               for (int l = start, r = end - 1; l < r; ) {
$ e% n6 o& i: q: \* f2 ?                   int t = list.get(l);& ?8 `9 x$ }/ W8 B
                   list.set(l, list.get(r));
0 n0 E( `5 s& ~* ]5 f$ [5 ]' @                   list.set(r, t);
  i. e( G4 B0 L* R' R& H/ I' m& p                   l++;5 l- t& w/ F$ c* i" e/ D  D( _
                   r--;" m9 j# Y+ q, ~4 T5 u5 g% ?
              }- P2 z6 X. Z; a( V) q
          }
: M0 a: W. l: }( C1 P4 V- D           start += len;+ O. }, A! @# V) c$ L1 Q$ {
           len++;# Y) B2 J- w; S7 j& p  A
      }
! Q8 T) Y# ^7 M0 C7 B       ListNode h = new ListNode(list.get(0));
) L: ~0 t( `9 B' E7 A       ListNode cur = h;
0 t8 N+ r& y+ x       for (int i = 1; i < list.size(); i++) {! o& ~3 V9 O: W7 t: ]7 Q
           cur.next = new ListNode(list.get(i));, N: M: g6 ]* v1 v' F5 m9 M
           cur = cur.next;
" |+ h9 ]. Y7 z3 k# i( x1 h      }
+ f% }3 C' {- n       return h;% v5 C. B4 T$ v+ c/ ]9 a1 e
  }; a' L7 f% b. F  j
}
" P9 |9 g7 k- d+ P9 s; F
5 j1 f5 m  P, J【 NO.3 解码斜向换位密码】
: J. I# W! d( ?9 E5 S8 B% `! G' X) ]& @5 P* S3 p8 c' E3 V
解题思路$ x$ z; S* d& _, ^7 n5 N  P
还原出矩阵即可,最后注意将后缀空格删去。$ l- L# e  A! O9 F+ H, p; J" T

" F) O+ n) M- a代码展示
- @! s& o3 D- [/ w) J
! t+ s0 Y; f) H. H$ ?, R) fclass Solution {
3 m1 y& I" c2 `6 v) R/ \# x   public String decodeCiphertext(String encodedText, int rows) {8 J+ @2 r5 }0 Z: O/ Z; C
       int cols = encodedText.length() / rows;
& n+ R6 f, J) {" R/ J& z       char[][] mtx = new char[rows][cols];+ \% P7 P2 u. e; r6 M' p
       for (int i = 0; i < encodedText.length(); i++) {
# N# t$ E* ^6 o6 y1 z, q* E" O; j           int x = i / cols;0 ?' B3 d, _" u, ^* C( G( ?
           int y = i % cols;( u' |; ?9 v3 T" V( L
           mtx[x][y] = encodedText.charAt(i);
+ p! ^& M# U/ _, U& p# _      }3 x5 H- Q1 f0 D0 W
       StringBuilder sb = new StringBuilder();5 |" M, s) m/ x; k( O
       for (int startY = 0; startY < cols; startY++) {( {2 j+ j2 C2 n* |0 }
           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {1 F8 t+ s6 O2 i8 i1 p; ^
               sb.append(mtx[x][y]);( Q" M' D/ H* V
          }
2 \- g9 z7 |9 t3 z& u! Z! Q* }% ]( w      }3 u4 T; `2 g2 g& N: B; _7 E& W
       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
1 b- ]) w0 L2 T3 W2 _; Z9 \           sb.deleteCharAt(sb.length() - 1);2 F5 [- I9 |* H0 t% h- \+ m
      }) P: B, Y9 W/ g4 m9 G* ^
       return sb.toString();5 \3 I3 m6 c$ a% Q' y5 I* H
  }
/ {, H9 E+ m! `9 t}/ _! I' K- N+ I$ z. f

/ N/ |# E/ w, u! y+ _
. k3 N% J9 q. H# {: L【 NO.4 处理含限制条件的好友请求】
5 L1 W( Y: `& _  c; x
* J0 W2 W; Q7 `! \, W. G解题思路" A3 {& F( h* b' [- B
并查集,详见代码注释。0 I5 O  r; K, p# {% @

9 e! \1 t6 M# {+ `9 s2 E) I代码展示
: ?1 g* w% h' v% l! e) K7 `2 p9 J
class Solution {; ]1 Y2 M/ d8 r2 j5 u, h/ J
   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {
1 ?& m" |3 b, K$ O$ |4 Q0 W       boolean[] result = new boolean[requests.length];; h$ b# }* G- i
       // R[i] 表示不能与 i 做朋友的人
; }$ i& e8 Z5 {% W5 Z* Z       List<Set<Integer>> R = new ArrayList<>();
/ X, Z7 m1 i! l: E       for (int i = 0; i < n; i++) {5 y$ P# Y0 u3 Q: X5 V# e
           R.add(new HashSet<>());
2 y; ~( `" n; A! B$ @      }
. u9 e  {8 b$ l" _% r       for (var r : restrictions) {
: O; b0 Z1 c3 u' _  b; u; L           R.get(r[0]).add(r[1]);
( X5 T( t4 t/ m+ ]& i; q4 g           R.get(r[1]).add(r[0]);
* v8 U. [" W8 R/ u: x      }
( b' F' T5 U5 \( f! r& l       // uf 维护间接朋友关系9 _% U9 {) A4 i/ s$ L; D
       UnionFind uf = new UnionFind(n);
9 I3 a2 I2 |& R0 u+ W2 v       for (int i = 0; i < requests.length; i++) {
8 F% J8 ~% Q/ g           var r = requests[i];
& f# x1 d! A% V6 i3 `% j% W           int f0 = uf.find(r[0]);
0 t/ \0 L7 x5 c% D  y           int f1 = uf.find(r[1]);. x7 W2 w9 n: y3 Y6 \0 a% H$ r9 K
           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了1 c: A2 \+ E* ^) q1 g7 [
               result[i] = true;  y$ Q9 [- l0 u+ Z2 B. D; {% ^
               continue;3 F0 e+ a' E; N9 l% Z
          }
( i5 N- @- u1 c$ }3 V5 `) ^           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可
5 {" X/ ?; z; Y+ X3 R           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
% T6 h+ ^  j+ Y5 K9 n$ B7 H           if (result[i]) {( N- h, ?$ ?1 j, \% M+ ^5 h% p3 f
               uf.merge(f0, f1); // merge 后 f1 将成为 根
+ D- L- n: i" Q! }6 ]% ^; p$ p               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
: u' R0 M8 V; ^$ z0 x) e: ?# |) K               R.get(f1).addAll(R.get(f0));
+ [0 Y( u+ [! M. v/ ^               for (int j : R.get(f1)) {) Q$ a. L4 e: c' Y  P
                   R.get(j).add(f1);3 O/ Q- q; D8 x6 Z
              }4 W' D" l/ t4 e( V* L! x, u/ x! d1 {
          }' m2 H  |! [) q# ]9 j1 E8 M
      }
  B" J$ l* D* `. y5 w4 j+ P       return result;/ F3 B, Z" B# l6 a! \* D9 L
  }6 O) ], U% W) t$ E( e
}
8 p. z% ^% q, ^1 {  }* N; @3 T3 Y9 ?, o% Z1 @5 F
class UnionFind {
, X! Z3 G9 d; i6 N   public UnionFind(int size) {. [7 `4 K3 M$ O- s- A# ?; D( L
       f = new int[size];
4 M  e2 J! G- r       Arrays.fill(f, -1);& ~1 r. S& ^7 r! }& a- N4 F
  }
* {- y) R3 V! ?5 e5 t+ M" X( H9 {6 C: n) l2 `4 f; O
   public int find(int x) {7 X: n* v1 K  x
       if (f[x] < 0)
3 ~8 x& P7 l" C+ w. l- B7 L           return x;8 x4 p; d* w& f. A/ f: T3 L
       return f[x] = find(f[x]);8 I" p  g; n( f" ]
  }
+ w  O  j" Z( y
" Y+ ^! p; k) M5 M1 ~+ P6 d& L   public boolean merge(int a, int b) {
; a0 E. S; D( x' J% w       int fa = find(a);9 Q' R- I6 E3 Z# f7 b2 Q$ ?
       int fb = find(b);
/ L0 H  I. C. M6 J+ r       if (fa == fb)- b9 Y  ~: |" G5 f3 n4 r& r7 C
           return false;5 i& ]6 P4 n( E
       f[fa] = fb;& r/ u8 ?; u" K, W- t$ t4 w
       return true;/ f+ ]; E1 i4 W2 z2 c/ w
  }
& W. o+ O# `  {9 g( y
. i; [9 t& @! I6 o0 e   public Map<Integer, List<Integer>> sets() {
: S9 A, ^! E+ f" @/ j       Map<Integer, List<Integer>> res = new HashMap<>();
% ?8 q! j2 x( y  i: I: X$ C/ g4 g; o       for (int i = 0; i < f.length; i++) {! D1 s) @% \$ B
           int fi = find(i);
: Y. f% {! h6 J5 }           if (!res.containsKey(fi)) {) z2 ~% T7 d9 |- ^2 ~
               res.put(fi, new ArrayList<>());
4 G) t$ @: h$ I" R7 W, n: H          }
- @, r% w8 ]' a6 v' V           res.get(fi).add(i);
4 O# U  ?, f4 z* D6 f. h      }$ D9 d' X  h' v! q
       return res;
' \% \( f3 r' H6 Z: g6 b  }
. {6 ~% x' L7 b/ N  ]
& E3 m& @% c; @9 `6 l5 h5 o( J0 h   private int[] f;' s/ f: d! Q7 _7 V- f, J, ~6 u
}: W- K) b6 d1 P) E& i3 I. A3 C
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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