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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】# D3 c) D% a! j

% Z- A' L1 b: e& e% a' C# [* \解题思路
" R! M  i7 M" j0 E4 t签到题,使用一个 LinkedList 模拟即可。
* l2 i  L0 g: y: k7 j# a( z
3 g, _; Q1 n4 Z- {代码展示
- R; j1 _) b/ R: X, G
3 y; {3 u: G7 c6 i* i6 zclass Solution {" n* Y% Z' K% k& e- X2 H( ^
   public int timeRequiredToBuy(int[] tickets, int k) {
  [+ F3 u0 V' X% F. p       LinkedList<Integer> queue = new LinkedList<>();) T' M" ?1 Q5 y" i2 s
       for (int i : tickets) {
7 `" X. K* P3 N5 b. J* u+ n           queue.add(i);- g" H9 b; n  C  F1 K% S0 r
      }
( l/ I- u5 W; m1 ]7 k( m1 O2 I       int result = 0;  e5 w0 t/ U; m  x1 @$ ?$ i
       while (!queue.isEmpty()) {
! Y5 m/ }# b! |5 \/ t1 _# f           result++;
$ o) L$ w+ s0 e' F% d& |% @8 X3 {0 D; a+ D           int t = queue.pollFirst() - 1;
6 P: ?) u5 C. x8 W. n3 ~# O- l3 T           if (t == 0 && k == 0) {
3 {; z) z; k3 W               break;
4 G8 _) V, f3 K: X          }5 C" G3 T; S, ^) p" Q
           if (t > 0) {
/ }/ z! z- _  o4 n+ D* [               queue.addLast(t);8 [: y1 v6 {7 t# C
          }. g4 g' V( ]8 A
           k = (k - 1 + queue.size()) % queue.size();0 P& S; F- u+ w: ]% w
      }
( r3 B1 e$ `4 N       return result;
. V8 K+ Y# U$ C  R- W2 p3 r  }
' _0 g# p$ n2 v) U2 R# y}" j) O  S; R+ i$ ~5 M. a) Q

& j, r! n# W7 g【 NO.2 反转偶数长度组的节点】
$ R) v) s+ `: f5 ]) U' x6 z. S6 V2 U" d9 s
解题思路; r! Y$ j0 p& \: o
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。
/ z  T4 \# ]8 [
6 n* v( I/ y' B1 ^" a% m& Z代码展示! t9 a; ?& q$ x! Q* Q7 _6 x
3 A: ?+ d& _+ i! H2 u5 M, u3 B
class Solution {5 _: F$ h  d" ]& E4 ^8 r7 |( G4 ?
   public ListNode reverseEvenLengthGroups(ListNode head) {
, h* y, D. g0 _       List<Integer> list = new ArrayList<>();& s$ b8 |+ p( y! i0 q
       for (ListNode i = head; i != null; i = i.next) {
# D& F" m) M' L. d/ I           list.add(i.val);& d# K  T8 }$ g% P
      }/ O% A/ K. O5 u4 C; f
       for (int start = 1, len = 2; start < list.size(); ) {
& b+ K) Y! N6 j1 T3 J9 f           int end = Math.min(list.size(), start + len);
. g, D- K9 ~; l: n9 X, T           if ((end - start) % 2 == 0) {& g5 k/ g6 N% ~9 T$ ~1 R1 x
               // reverse [start, end)
4 F1 r9 q, o% `% b5 t               for (int l = start, r = end - 1; l < r; ) {2 u4 c& u* i% ?; `- a0 d# ?
                   int t = list.get(l);
; e3 [( N7 A4 B) {; x6 \                   list.set(l, list.get(r));
) x) u- p+ p8 f2 p/ L& V+ D( L  ^+ O; F                   list.set(r, t);# p9 ]6 m' s" r! D
                   l++;' R  c) C: C  f
                   r--;
2 m3 M8 F# N$ w* V              }1 L: L, H% J2 C! t: e0 f
          }
7 U/ x1 K6 U  d  D! n1 ?           start += len;
' Z! n* a0 y1 {! @* T/ [/ y           len++;
/ ]" }# W$ j& u      }
) q, w5 g8 o! M% `6 S$ B       ListNode h = new ListNode(list.get(0));* O& N- ^' Z3 d) ?
       ListNode cur = h;* i- j5 M, x- \! G: v; I  t
       for (int i = 1; i < list.size(); i++) {
+ f8 d) X$ F2 c           cur.next = new ListNode(list.get(i));
7 c& c9 F7 L3 l8 B$ _* ^           cur = cur.next;
6 m) V9 q! k9 q$ ]) H9 i0 B      }
' j& z/ D$ J$ y" m# V, [$ l2 N  T       return h;* S7 a- Q6 G) `) b- k
  }/ D. [  Q. K8 Z
}$ i  Q9 G3 Y( v  k$ g
5 C1 l! h. B: s+ R0 X3 T
【 NO.3 解码斜向换位密码】! }) T) ~4 C2 C3 x$ U( D# N

& x1 C" G$ r3 Z6 a; E2 S, [, L解题思路
- K3 M# A; s3 t还原出矩阵即可,最后注意将后缀空格删去。4 M. W, @) X/ w' w0 A& Z, p
( y/ e' F1 ~. D
代码展示
3 J  D& l3 X. y6 I, z6 H+ Z3 m/ y% k
class Solution {0 t; H4 ?5 o3 L5 _: B- y% D& t
   public String decodeCiphertext(String encodedText, int rows) {
- c9 k: h7 Y+ V# Q6 @1 ^6 N) t       int cols = encodedText.length() / rows;
- B! ]) J2 O8 Y       char[][] mtx = new char[rows][cols];
1 ~3 R* \( g* t# z5 P/ \       for (int i = 0; i < encodedText.length(); i++) {! N$ L8 E# L4 l; X
           int x = i / cols;
8 P" V' C, E$ q: i           int y = i % cols;! g, [! A2 ~9 t4 I" l) q; {5 A
           mtx[x][y] = encodedText.charAt(i);
8 L7 m0 U6 }8 G. q  [      }7 l8 w- H/ B- J6 t
       StringBuilder sb = new StringBuilder();8 j5 t6 i: B4 g% I( R; U- t8 Y
       for (int startY = 0; startY < cols; startY++) {
0 M4 A$ ]  _) _+ P3 z           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {+ a9 p1 _4 b7 M
               sb.append(mtx[x][y]);
8 i7 T+ M1 O, d) A" A* Q/ y          }, r2 F4 A$ r+ y6 V6 D& [4 I
      }
6 M4 @1 J0 D: m! i% D& _       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {0 x  ]1 P9 `/ ]$ i" R% b" }
           sb.deleteCharAt(sb.length() - 1);  ^5 c0 K! B7 s* a$ L  R, U
      }
; I9 m5 B6 U; G. r' E       return sb.toString();3 q- {' H' Y( p0 N2 x
  }
  r+ J1 V- Y% S) }+ G}
' z% O) |  L- `9 P" `5 \+ L
& w3 C" X5 S9 A- X! E' `' [& v
; p3 @/ A9 I  @& i" j1 l【 NO.4 处理含限制条件的好友请求】0 D; C: H, P( u5 m7 z- {

$ a5 I0 s) s4 a1 [" I" y; y# G解题思路; r: c2 d4 L1 t' ^$ b
并查集,详见代码注释。, g. s! k4 M# x; O0 k
3 ^9 D- u/ D) _$ S/ w3 U
代码展示8 d- j1 o% y) @: I
% E5 d* G9 C9 o! M0 N3 K
class Solution {0 l: I4 E' U2 x, ~
   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {' D* C2 G0 B" H. C7 u# n8 @9 _
       boolean[] result = new boolean[requests.length];+ E6 I2 I& z' l/ N8 W; }3 |% p: v$ v
       // R[i] 表示不能与 i 做朋友的人6 G5 z; G; V5 _; X4 ?& Y0 x
       List<Set<Integer>> R = new ArrayList<>();5 W8 `3 F7 `" d$ b! E2 n5 M
       for (int i = 0; i < n; i++) {9 t+ n! R# c. ?5 R9 l3 y
           R.add(new HashSet<>());1 {; E0 R+ F0 S! s( p! D
      }# N/ _5 d/ h0 q- R
       for (var r : restrictions) {6 r5 _! N( Q6 L; b3 c( s5 h
           R.get(r[0]).add(r[1]);; Y9 E* T7 H- e- ?% }# b6 Y3 ^
           R.get(r[1]).add(r[0]);
! B3 O/ N) l* i      }
1 ^& f( x7 q/ p) h( y( h% M       // uf 维护间接朋友关系
0 c2 V9 s0 S; m- x- {$ z       UnionFind uf = new UnionFind(n);& {9 x  d" w  a2 B
       for (int i = 0; i < requests.length; i++) {% v! n5 W4 k# _; R% R
           var r = requests[i];2 c3 P* D( D' ]9 a2 j
           int f0 = uf.find(r[0]);
4 B' u/ e$ P: }; X6 v9 F           int f1 = uf.find(r[1]);2 U( B& i5 x6 y# o  U0 x
           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了
" o' o, V& G, x& [& J  G4 a               result[i] = true;
1 l/ f* q* p- x/ y7 F# M2 Y               continue;
" t" c8 p$ e! y% n$ H1 \! j$ s          }" k& g$ L, X  A) n/ D: W& c2 [
           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可2 I' w; l& B, c5 X  R
           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
! Z* n/ ]! _" w* r! Q5 v           if (result[i]) {: T$ n5 t" {% n# I/ O
               uf.merge(f0, f1); // merge 后 f1 将成为 根
. Y0 w0 ^1 w3 A6 G# ?               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
9 T# k8 d$ H3 Y; q  U4 F. Z               R.get(f1).addAll(R.get(f0));
8 H+ S2 T: Y( J( ?& @3 V               for (int j : R.get(f1)) {
3 A& J4 ~! d0 B6 B% O8 R/ p% n! v9 Z                   R.get(j).add(f1);# h  b( g) ], C9 u2 n$ F3 Q
              }, r7 J8 _- ~- @) D
          }$ d9 F  `# `( V1 D* ]+ j/ C8 Z4 {
      }
- R: k! Z" {8 ~7 q, W' q6 U       return result;
' [7 D$ J1 I6 R: b$ k  }7 t4 K. V+ C5 S4 Q: P
}6 T( u% f7 X9 i+ U
1 b0 i) P" e- o& A
class UnionFind {' Z; R3 D# ^  u  _! r
   public UnionFind(int size) {( f( U. f( F, Z! ?7 P/ Y
       f = new int[size];) f- w0 X9 Q9 B8 ^: t
       Arrays.fill(f, -1);  e' t* m2 X( f- _
  }
9 I! @- Z" u% y" Z6 `
) j  N& S; z2 W' l- i   public int find(int x) {) ^8 k& g" U# ?$ B4 [2 B: \* K
       if (f[x] < 0)
2 t5 U6 [* n6 v3 v; d$ w1 l& _           return x;
* W) h" ?1 r. f8 Z6 i& V       return f[x] = find(f[x]);
9 a" [: b* ^9 l' x( ]  }
6 H- ]) F) z% \* V. R. H" {7 u. J: ^3 o. O! Y
   public boolean merge(int a, int b) {
: n* G- _: Q! z$ l5 {3 j) F$ w       int fa = find(a);- p# k" f! Z" R
       int fb = find(b);
3 n2 \3 H. G" k4 w5 g7 a* ^       if (fa == fb)
+ A3 B# q. E% |; e+ r4 a7 u           return false;
( u3 B( B7 t2 _. T( m! D       f[fa] = fb;$ Z" j  u9 P+ T* U" h. [% P, y. f/ t
       return true;
! X8 o7 r  a% Z' D  }
0 u9 L) t+ O# d, n( v# U# W2 Q- `8 Z$ y: B% k
   public Map<Integer, List<Integer>> sets() {9 C/ c, t, a4 M' b0 g1 m1 l' e
       Map<Integer, List<Integer>> res = new HashMap<>();
) S; s  R. u' ~3 i2 p       for (int i = 0; i < f.length; i++) {
" L! Q% c$ Z! u% h& `1 V; k& V           int fi = find(i);
5 p4 j+ `+ I- U           if (!res.containsKey(fi)) {# X$ j- s, L: z0 m: T
               res.put(fi, new ArrayList<>());
7 n+ y- l5 @& {  ~          }; @5 }" W7 ~! y4 I5 H
           res.get(fi).add(i);
7 z- N2 m" J/ b: ~2 T4 F: h8 F      }& s4 d: b1 w, `0 P
       return res;
. [: n6 d3 m! K1 q  V9 x4 s/ A  }
0 t) @' y1 `0 w% J5 e
0 u2 }0 w! J8 P1 I   private int[] f;
# S* j( k: L# T7 c! s* v3 F}
( k: E2 w" ]" C" x7 g
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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