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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】/ `* a! d/ E9 |: n% c* g

" }& D; e: P0 U* m) W解题思路
% q% H1 ]. @( o. r9 F4 O签到题,使用一个 LinkedList 模拟即可。& \, j: t" r/ P- ~! p* `) G
8 h2 Z9 ~5 {; q
代码展示9 D* Y  O! @0 e2 l! g- L
8 H" D( i( G; N4 o/ N( M% {# ~# a$ V
class Solution {
! c% I; Q3 r/ B- J   public int timeRequiredToBuy(int[] tickets, int k) {
( h4 D9 @9 `$ H       LinkedList<Integer> queue = new LinkedList<>();% ~, w) q5 }# U! M
       for (int i : tickets) {- D  a1 ~- P. @% {
           queue.add(i);" X+ Z% h6 T+ L+ P% l
      }4 |  T7 h8 g( E1 \6 q  J, f2 ^
       int result = 0;$ n+ h8 C8 [' a$ Z5 l
       while (!queue.isEmpty()) {
7 r) C% P6 h5 O( s           result++;
& J' u0 h% w% a) v, o& h           int t = queue.pollFirst() - 1;( Q+ \' J! |- s# D1 \- M
           if (t == 0 && k == 0) {3 l- P) `& G- V; O% n
               break;6 ?& s8 `! Q& T) y# b. q) E: R
          }
; V( Y4 k! T, x9 P           if (t > 0) {
9 s7 A4 H+ R2 I3 U1 Q" Y               queue.addLast(t);
2 t* n3 x/ g3 g/ |          }
) A" K6 X- l9 W5 g8 v           k = (k - 1 + queue.size()) % queue.size();# I  D) \3 W* }6 }! E
      }0 }# O4 @  c" S0 [/ Q. M; J" y4 _
       return result;: u: G5 Z: ?: P' ^4 R
  }
& Z' Z" P2 F$ F}
6 V: z0 [0 i2 O8 w. [. A
% G9 F6 b7 f) c! {, a- h5 L; n  k【 NO.2 反转偶数长度组的节点】0 A6 [2 V( ~2 h6 L' ^  n$ b$ X- |& g

1 }8 ?" U2 N' P# R& k解题思路8 ^6 H' A# H6 D& t7 `
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。
/ O  W$ N. R% k9 [' F0 o( m( ~, K, {% T* F! u( B" t
代码展示
. v0 @" a7 Y. e' H; s: U
5 e8 k& T7 C/ Q( R- R$ z* qclass Solution {/ Y0 a1 L; [& {6 Z8 A( f1 r
   public ListNode reverseEvenLengthGroups(ListNode head) {) }" m. @3 F6 |" N6 c
       List<Integer> list = new ArrayList<>();
" N1 b3 s8 B- R7 s$ T. k4 Q6 p5 f       for (ListNode i = head; i != null; i = i.next) {* r% A8 l+ E9 @# o, }* D$ c9 w
           list.add(i.val);& q  d" P' H0 |7 A- M2 W
      }3 m" B* v* l% C& e' a9 {& c
       for (int start = 1, len = 2; start < list.size(); ) {
. e. l$ @& M9 [) C; t           int end = Math.min(list.size(), start + len);3 e0 P2 ^) ]! e# \& r% e. ~) u
           if ((end - start) % 2 == 0) {1 Q$ c* P2 T  n1 t) Q
               // reverse [start, end)( ^- j; d* i7 }, A
               for (int l = start, r = end - 1; l < r; ) {
& z+ q* U4 g# Z$ R% h1 b6 W- A1 {                   int t = list.get(l);6 T/ d1 H/ _% _% [; g/ H
                   list.set(l, list.get(r));* `1 Z- J. }' I3 H3 y( l' [( C
                   list.set(r, t);
' Y( h9 B( l# m4 }" U$ q/ z! \+ s                   l++;
7 I- N( L& g# W                   r--;$ P" W9 ?' \7 B3 ]# n: Z+ z
              }
  f# w/ P; \. ?5 T/ i  F: @          }
, v" r( j% Q- F( `# j6 R1 W           start += len;
- x8 @0 e' z/ w" a           len++;; y/ k* ?0 a, R( s) Q* ~
      }, v+ J# t" V# ]! e$ J( ^0 D0 i9 Y) q
       ListNode h = new ListNode(list.get(0));. ?) `5 T& ]2 A3 F' }' k$ @4 R
       ListNode cur = h;
2 L, E5 e" U( T       for (int i = 1; i < list.size(); i++) {
* e1 y% X5 H0 |           cur.next = new ListNode(list.get(i));' V; i7 C2 b9 V6 X( H
           cur = cur.next;" _8 r1 ^; r  n4 M+ ^9 [9 K
      }
: ~* i; I5 a$ f; l       return h;) ~. o& J! p3 o+ i' Q5 M
  }
, t$ H8 T1 z. Q9 G% v}! R( H) h9 t  [4 E9 R

$ d; A1 h8 U+ S& M0 _1 |) a【 NO.3 解码斜向换位密码】
$ G) E$ ^% m' K+ u/ A0 \. W
: ?; G2 k- @, v# L6 `解题思路3 ]9 ?/ M0 j' I/ I, B) |
还原出矩阵即可,最后注意将后缀空格删去。4 D/ B( d  P- z4 h) q/ x- v$ D$ V- D
! c, G3 P. h2 {
代码展示  z+ @2 \7 M( |# ?

7 D5 g4 w, P# s! H! c+ iclass Solution {! U! s2 X+ ^( S# C0 j
   public String decodeCiphertext(String encodedText, int rows) {
; ~% a( a9 Z2 P. I4 s: M$ W" v* E       int cols = encodedText.length() / rows;; ^& s7 ?/ t8 p
       char[][] mtx = new char[rows][cols];# Z  n8 Z/ \7 f& E2 l; X" S/ U" V
       for (int i = 0; i < encodedText.length(); i++) {
0 C& c6 C4 S) t. ]5 I           int x = i / cols;
' r3 D# ]5 E* v* H/ ^/ d           int y = i % cols;2 e: R" X! p  ~5 ^& ~/ Q2 o
           mtx[x][y] = encodedText.charAt(i);
- p3 p  g! |) ^, b. X- L( R      }
$ _" X& z1 H1 n% |: A5 S       StringBuilder sb = new StringBuilder();
9 p8 [* a  a, p+ K% M       for (int startY = 0; startY < cols; startY++) {( t  s' e: c  D" H5 w
           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {# U: c) ^& N: N
               sb.append(mtx[x][y]);% u5 W$ i. J; o: F1 x, {- B+ ~9 M
          }* \2 C7 `8 Q" k! G- e
      }
# |1 X4 ?) H2 W" J/ Q       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
2 f9 }5 G1 s( X8 c$ ]           sb.deleteCharAt(sb.length() - 1);9 E, s1 c( k( ~, z" |2 o& I
      }
; y# R+ ?& C8 B, X  l0 {       return sb.toString();
) k7 h, Q: I; L! b2 \2 q  }
  h! N/ X4 z3 Z" j; p0 z}
) |1 t; E% B  u
: ^# K' r( ^  W9 ?4 x
' y' t/ y$ K: N& l8 P' t【 NO.4 处理含限制条件的好友请求】
# E: A& x" S: `8 Y  q- l9 e0 B* \  a. p
解题思路' R9 P! A9 o2 s% f
并查集,详见代码注释。
! O0 _% X* P9 S6 _& W, Z, e  v& @+ w) Z2 j% s
代码展示
' p& F2 t5 E2 h' i7 t9 V. _' V# o5 I& c6 I5 p" _  n
class Solution {; k, _0 ]- C5 e5 n8 `0 o7 s/ U
   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {
7 {9 K( X& c3 @) l$ ?" u       boolean[] result = new boolean[requests.length];
$ F, l# N6 G3 _  e       // R[i] 表示不能与 i 做朋友的人
# Y( a9 s% o! x5 H& S9 f' q       List<Set<Integer>> R = new ArrayList<>();
; i* o8 g. k/ L& ?       for (int i = 0; i < n; i++) {1 E; `6 [; N# L% A7 s8 Q! Y+ v" I6 }
           R.add(new HashSet<>());
$ _: M& I* V" z% |# P/ E      }" O6 V  j0 ]* t. o' Z" z8 o& U
       for (var r : restrictions) {7 i- B9 s1 M0 H+ ]& X" Z/ S7 t
           R.get(r[0]).add(r[1]);# c# }) @$ L! {; t$ G7 A
           R.get(r[1]).add(r[0]);' H+ |' V7 K; X1 T1 H; w, t' a& v
      }  u, c" W- l8 S% g+ r+ C
       // uf 维护间接朋友关系
# q* C9 W/ a3 Y8 B       UnionFind uf = new UnionFind(n);0 d/ v/ F6 g) f6 ^) G2 i
       for (int i = 0; i < requests.length; i++) {
# |1 g4 L+ P; j/ q           var r = requests[i];8 B* U5 d# ?8 H! P) h" R
           int f0 = uf.find(r[0]);
" w" {9 l: U% O2 A4 m1 `' E, M0 ?* E           int f1 = uf.find(r[1]);  X0 E& d( ?* g, P
           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了
6 ]0 i( w0 Q* g0 v9 Q) R" `               result[i] = true;
7 w8 s4 V! ~* M% W% f! ]$ f               continue;
  W. L( f6 h1 c8 t          }
" n1 E0 H" G1 Y* i/ R           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可
  f1 f% |/ F. p" G# ^1 q1 H( f2 q1 r           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
' r; }- R; g$ I7 `. f6 ?& n# v           if (result[i]) {
! a/ d; ]& i4 t               uf.merge(f0, f1); // merge 后 f1 将成为 根( H; ?1 S4 O& i3 z( s/ i
               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
) i  V9 H5 l3 Z0 w1 p               R.get(f1).addAll(R.get(f0));
" l0 H- K+ [7 H               for (int j : R.get(f1)) {$ E& T  E" {' }5 u( |+ \+ r" F
                   R.get(j).add(f1);( U  S. q& i. j/ @
              }
3 G9 C& m$ L! G  _2 W4 X* j8 `          }+ d, i+ q! S% m3 T: d
      }  ?) F) U: X' T" d" m$ I3 `9 q
       return result;
' H, E- n9 X; N* o8 \: U5 V& v8 U3 ^  }  E, j. |! G1 V
}
+ L% \2 l# \* M% L8 ^6 E
9 i% h, O6 S' A3 eclass UnionFind {
% G( A% F0 `7 B! L) X, P   public UnionFind(int size) {1 G, M% G" Q5 H
       f = new int[size];# u* J  |5 j7 p5 t+ C5 x# x& a
       Arrays.fill(f, -1);* F! [/ m; G# |& v; x- G
  }. |9 D' Z2 M, E" s+ l$ @
4 d+ O: f9 e( Z" @
   public int find(int x) {
7 a3 q4 J9 d9 d) t, B* U2 T       if (f[x] < 0)
$ [* U6 a! K3 S9 ~/ e           return x;
- Y3 h! l, `7 Q       return f[x] = find(f[x]);
) d. }# N" \% a/ m% a# r4 [  }
( H' R$ {- e" m' q, h5 v! j% Y) ^$ U% H# z9 x$ e
   public boolean merge(int a, int b) {& ]' ^* }  L' ^, g4 j
       int fa = find(a);  ]" P$ D) N4 d" o, }
       int fb = find(b);
+ E, J. D+ j! c, r7 v1 D0 Z       if (fa == fb)
- p# o( k  b" `) R- q, X/ Q' O           return false;/ n( Q/ M$ o$ H5 e- K
       f[fa] = fb;. I* \  G! k) q, b, T
       return true;
: v; y# ^1 o# E  }: ?$ J  F8 R2 G, c5 h0 M

: S% C2 ~" v$ |4 D" Y8 o5 _  U; l1 n   public Map<Integer, List<Integer>> sets() {
2 z) |+ s& x* S' c4 q1 Q       Map<Integer, List<Integer>> res = new HashMap<>();
2 Y: b: p! W) o( a* y  t& I       for (int i = 0; i < f.length; i++) {' i. ~2 R! ?$ F' H* m  d/ ]6 y
           int fi = find(i);& ^0 ?$ R& x% ]$ f, y) O  I
           if (!res.containsKey(fi)) {
$ @( f( h1 T- k, z6 Y7 Z               res.put(fi, new ArrayList<>());
" a9 g$ ^; z; L; b) r9 R2 Y          }
) T! G9 t  w% Y% d           res.get(fi).add(i);6 t' c, N' v) A/ Y, i  u# q
      }/ l! Z. ~( h9 K. Q- C
       return res;0 w& \6 h5 F6 D" a; k
  }
3 p1 Z; X$ D" V1 Q& w, ^7 X
! n3 q( y/ i5 p7 B   private int[] f;
8 O. y  a2 |0 W! L8 A' b/ _}$ _- V- t+ W2 d8 i! @$ ]
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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