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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】
, p1 H  ?0 T4 t' ]. h' {. M2 |* y. x
解题思路+ q8 a+ |/ t, h8 ^8 V: U4 B& t( u
签到题,使用一个 LinkedList 模拟即可。. t' ~# u& u* n: W8 k! S# _" }
) s, R; }+ r: E; Q# N
代码展示1 b: S. p! C. ]( @/ P! U7 T

) L! e/ P1 h* y2 V- A, vclass Solution {% k. L7 E" O* a1 Z8 ]1 P
   public int timeRequiredToBuy(int[] tickets, int k) {0 {, w( t0 G8 E
       LinkedList<Integer> queue = new LinkedList<>();. }, G- ?+ ?: g$ {  _9 `9 g
       for (int i : tickets) {" \5 N$ \' P2 f6 J' O) h/ w
           queue.add(i);, S3 E$ |  I% {: l0 E# z6 P2 P
      }
3 D2 ?5 _2 `5 `3 R/ R5 Y8 e8 o" F6 D5 {9 x       int result = 0;
, f9 J2 E7 |/ N' O! O" @+ u4 y       while (!queue.isEmpty()) {
4 Q, |+ ]9 q# W% W; ]. [3 B           result++;* R, ^4 I) Q3 ~, F  e
           int t = queue.pollFirst() - 1;4 E3 q. ]" N! i, {
           if (t == 0 && k == 0) {
( L* d- a: l* x0 o$ _; b! v+ Z               break;3 L+ O9 \* u: F! F6 v
          }$ N& `1 k; A3 t5 T5 j, O* @
           if (t > 0) {
" A( D( m9 t% o; p3 q9 y               queue.addLast(t);
/ q) v* f! |1 @% Q' ~8 o          }
. P5 B) B5 m  s+ Z' a           k = (k - 1 + queue.size()) % queue.size();
6 T# A# H1 U; |0 F( w' L  D      }! S) T/ ?7 c" x, q; O
       return result;  e$ z* f7 J4 g' L3 i3 n
  }
8 i) j7 r" e1 p# _, Z}$ o: G! {! Y9 I, \! K# f% f
" {3 i$ g/ A4 H
【 NO.2 反转偶数长度组的节点】
' N+ [, ]' k6 o" G8 M3 g7 i3 O7 ^" Y& W& A
解题思路
5 ^! O, ~& W7 C7 S& [$ G数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。3 n! m8 f# [9 y0 o. a. v6 N

) A! M/ b9 f. y代码展示
& l/ ~5 L, Z# g+ P7 {5 U# ?
  l5 }4 a  f4 c% n$ F! M2 h) ?9 Eclass Solution {
, [* M& D: E( p3 t   public ListNode reverseEvenLengthGroups(ListNode head) {% R6 z6 A* W, y
       List<Integer> list = new ArrayList<>();2 U# n9 F. X  o" {. h0 Y
       for (ListNode i = head; i != null; i = i.next) {
7 ]7 i9 i' r, z           list.add(i.val);
9 e6 H3 J- P) S& O+ {      }& o6 K. `  \9 p( C! B8 P
       for (int start = 1, len = 2; start < list.size(); ) {% I, s2 I0 }& w: w
           int end = Math.min(list.size(), start + len);
; i$ y9 X: R9 C$ d/ Z4 Q+ O           if ((end - start) % 2 == 0) {
5 i9 Z! _2 W+ U               // reverse [start, end)
! d4 N/ W9 `& S# R( \% y5 C- v               for (int l = start, r = end - 1; l < r; ) {
9 E' P/ J8 K5 d2 _5 m. f6 r                   int t = list.get(l);7 w' a" P! `* F0 o% P7 L
                   list.set(l, list.get(r));
# ^& J5 M6 ]3 M! ]# q$ \1 K                   list.set(r, t);7 g( j" r# T0 q; v/ w6 b% N
                   l++;' G* f: O; J# P" s" Z3 s
                   r--;) ?  D8 j4 e& D# w. _- y; \
              }& J- l  V& ^: F9 c5 V* L4 E6 i1 e
          }
2 Z9 l. H% \+ @- S) u           start += len;
4 {5 B' F4 K7 t1 ~. O           len++;" w% l2 i4 Z* M7 U. e
      }0 N/ t4 W/ U, z% I# f* V- p* U
       ListNode h = new ListNode(list.get(0));
. {8 `: o: i. K5 |; b! L' j       ListNode cur = h;7 `6 b7 a# ~" i  S4 @& e2 |
       for (int i = 1; i < list.size(); i++) {0 f1 c8 K* g3 z7 x2 m$ e
           cur.next = new ListNode(list.get(i));# `* O$ @. \8 ~9 F- v1 I
           cur = cur.next;% c& c0 G+ b0 [! t# e
      }
: I" _4 b& w2 @       return h;
' S" F8 v/ ?. P8 L8 y  }( l2 B8 @+ E% f9 ]4 g& }
}( w; r6 d2 ~4 R+ @
/ s/ F7 X6 ]5 Y6 k9 F
【 NO.3 解码斜向换位密码】
1 |& B( }# S2 z) @: {
+ F3 [( a& b5 F/ l  V. g$ A解题思路: H; D% Q! ~/ T  S
还原出矩阵即可,最后注意将后缀空格删去。, V( [/ S- R, c; G

0 \4 v. A' A+ g: X代码展示
/ D; @  V, ?0 _5 w! W$ N
& |3 {, Z0 d" p/ c4 f, }class Solution {* z# ^& u  u6 ?9 M
   public String decodeCiphertext(String encodedText, int rows) {
+ k2 K$ M& W1 P1 o7 V( k' U$ p       int cols = encodedText.length() / rows;
' J# d# V6 f0 e       char[][] mtx = new char[rows][cols];; d- u! ]; i4 a7 q$ L. x7 N! F
       for (int i = 0; i < encodedText.length(); i++) {
8 ~& B& d5 m7 [8 o           int x = i / cols;8 f0 Y1 z* l+ z, s! e) A8 c
           int y = i % cols;
+ v) O) u) \' N# s$ n2 `$ d( t' Y           mtx[x][y] = encodedText.charAt(i);& q4 b, L. r2 S& @- l  r4 O
      }
$ V' K5 \$ H- r3 m7 P' S7 E9 G4 L       StringBuilder sb = new StringBuilder();8 l) A$ a2 Q6 y; z9 L4 W
       for (int startY = 0; startY < cols; startY++) {
+ e6 x  |& h0 z# P0 E           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {
, w% {8 S* ?! s8 m. }: n& w               sb.append(mtx[x][y]);2 T& \) Y" e. _
          }
! Z# l! a. P1 q2 ]+ c! ^      }
# w; x4 i7 n. J       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {- X" u7 T& G8 F1 E2 @+ Z/ I# x% ?
           sb.deleteCharAt(sb.length() - 1);
2 h% x* C7 P! k. [+ i7 q8 a      }# p: r, E+ x4 ~- u
       return sb.toString();
6 ]3 }- m9 a- q$ ?- h& I) D6 a  }
) G" z# ^: i% ^}
5 l# {8 }) x% i) d/ o
, I! a3 V1 c1 z3 Y) [0 S: B1 b, G& R3 Q# y
【 NO.4 处理含限制条件的好友请求】
$ J5 X! f. h2 s
5 T" m' W# I% ^解题思路5 {: ?; ]; w* L  d: N9 _" Y! p
并查集,详见代码注释。
1 p2 k- a9 I; v' |, A) o( @6 c# _; S) A0 P: g  ^2 z
代码展示
. X5 R  R- i) Z9 {! n5 O# |; {& ~6 a  C+ [4 {7 x
class Solution {
. R% M1 F4 V+ o7 K- H6 d   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {
) [& k) [% V& R5 }$ \+ ~) e       boolean[] result = new boolean[requests.length];
! X, `) S# ^( C# K0 n       // R[i] 表示不能与 i 做朋友的人! R8 \8 t0 f2 U3 i
       List<Set<Integer>> R = new ArrayList<>();
1 j" V  \0 P$ p. W" B       for (int i = 0; i < n; i++) {6 A  I$ J% J+ t# @1 p: E" ]
           R.add(new HashSet<>());! F" R" a; Y1 ^- R$ f
      }
( b* a) k- c3 e2 S  I       for (var r : restrictions) {6 ^# W4 C% z- U# G" I) W3 w
           R.get(r[0]).add(r[1]);) R; ~& K8 `' q( E8 E6 q6 z+ _
           R.get(r[1]).add(r[0]);1 g: v4 G4 R/ l4 M
      }9 }( N7 {. t6 w/ O
       // uf 维护间接朋友关系& h! b- r: i2 O( R. p! C
       UnionFind uf = new UnionFind(n);3 Z2 C( X. h+ k* T/ N7 O2 R- C) W
       for (int i = 0; i < requests.length; i++) {8 r# M! G; @9 ^3 K0 h* Q" v* C: i
           var r = requests[i];
# h$ X% p  M: v7 q9 Q5 l           int f0 = uf.find(r[0]);( M7 G  S( U$ l5 w# M' O; c
           int f1 = uf.find(r[1]);
: x; D( K# g& o- o1 P8 d7 ~           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了6 u/ V2 R& V6 c, m* }
               result[i] = true;
( y/ |% j- c& A7 ~( D0 S               continue;) ^& c0 ?6 t& P6 V6 w0 \) s* p2 [# t
          }
9 W) d) z5 R3 {- ?5 ^           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可( W9 A+ b; e, d/ R
           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
+ m/ j8 L1 ^! D, ]) M1 Y7 K           if (result[i]) {9 T3 S* @! }( e6 b. Y( ^& p$ t
               uf.merge(f0, f1); // merge 后 f1 将成为 根
7 \( Q6 h4 N- m( m               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了. ~4 L& T8 f% m1 J' m
               R.get(f1).addAll(R.get(f0));
( a9 F7 V3 z# u- o               for (int j : R.get(f1)) {
0 i) k" o& L. P7 W                   R.get(j).add(f1);
1 |" `* i6 P, H- X, q  p4 ]$ W. q              }
6 Q8 `% z5 J+ h% {* G! |- h          }
0 y- X; [; m( B      }( A3 n) h! \. [& m7 b% A
       return result;! e) C) D0 s0 p2 v, y8 O3 m8 X
  }
7 z9 m5 O. l; z% Y; }: j}
0 G0 B$ t# S4 i% U9 z1 d2 d+ Q6 D5 T/ q+ ?6 s2 w& |
class UnionFind {9 X0 i8 k0 f  R& x% p/ ~
   public UnionFind(int size) {
( h. a0 P8 ]) j+ {- q$ N       f = new int[size];
2 C4 G6 y: q6 M       Arrays.fill(f, -1);1 Z' o. h, }: W( B! h9 Y
  }7 X6 h4 m/ U( l/ Q* G: b4 a

& E6 r- u0 ^5 o; O- G   public int find(int x) {1 B0 A3 A* D7 n  X! X1 L
       if (f[x] < 0)! y! S& ?# i1 ^- N
           return x;- F2 X' ?7 d5 Z# q$ Q" G  d
       return f[x] = find(f[x]);
- h- G- b$ f+ f; [2 h7 s  }; x3 t6 \" M3 V

- B( ^) U9 v  U; Y   public boolean merge(int a, int b) {
+ A0 D+ J2 `: h4 ]  h/ Q% p       int fa = find(a);/ K) C, y" p, _) ^) ^" O6 j+ X7 b
       int fb = find(b);
( T. `8 O9 I: `, ]4 u* R4 l       if (fa == fb)2 L; p; I, w" N$ i
           return false;! \, J7 o' P& f7 f' d! i) [
       f[fa] = fb;
) e, b" Y7 W# P! d, N       return true;
& C, j7 I# E* s/ p" K  }
$ ~1 U) K0 c% H' s. o, C9 w1 G$ o9 w3 s  P8 ^
   public Map<Integer, List<Integer>> sets() {
, J; d0 [* G9 d- g       Map<Integer, List<Integer>> res = new HashMap<>();
6 i7 H4 l, X/ l- E' v       for (int i = 0; i < f.length; i++) {
) Q4 v8 e. k" H           int fi = find(i);# H5 W3 o* K' D( T' k2 |( Z4 i
           if (!res.containsKey(fi)) {
7 N3 ]4 ~5 o0 q: U               res.put(fi, new ArrayList<>());
$ T/ l/ l5 R- t' J          }8 ?( c) N" o  Z* M; n$ k
           res.get(fi).add(i);
7 {. [0 d" f( I8 V" o' C. p      }8 g( P: s! C3 O' k: S( B9 I
       return res;
5 S" ?7 |6 E9 ?5 X6 n  }
! R2 e) B, m/ h( u5 p# m+ a0 A* k3 ?$ s, p
   private int[] f;
2 _- q1 C7 d# `  h4 r, p( \$ ^" y0 g}8 ^2 ]. L7 @2 W, A
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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