找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 买票需要的时间】
; _% l# o( a9 l4 Y: L4 L0 ^: z7 s3 N8 z/ v) s- R3 T
解题思路
3 L. o( V( r1 {+ i4 Y& A签到题,使用一个 LinkedList 模拟即可。3 N  h: H) M; b* ?5 E  e
  w4 U; q( u  |& N
代码展示
( [; S1 b  q. @/ L" s# d: w
7 l6 f& k. b& t! Iclass Solution {/ L/ j, A% w6 @
   public int timeRequiredToBuy(int[] tickets, int k) {8 S: H7 _9 @$ s9 {. Z% ?) t
       LinkedList<Integer> queue = new LinkedList<>();
( _( U* C# C7 K; d8 H7 k8 ^       for (int i : tickets) {
8 F+ Z" |3 H( |" j: t/ z           queue.add(i);( a. @& ]& @/ ?- L3 U, L9 ?, K
      }0 a6 J, A3 n# h, D" Q/ c; o! A
       int result = 0;
7 u' z0 p, E0 r# |  P       while (!queue.isEmpty()) {* k0 @1 F1 J4 `( D& B' W7 \* S6 g
           result++;
! Y  Y, M1 Z& _/ x           int t = queue.pollFirst() - 1;
5 _9 K4 \! F+ p/ C: {7 x1 D2 I           if (t == 0 && k == 0) {2 A* O$ D* C/ l
               break;
2 y9 S4 z( }% a6 Q# L          }
* T; e- c3 G6 k- D           if (t > 0) {
* q3 L  I3 i$ Z+ d$ U0 S" X               queue.addLast(t);
9 k9 ]3 n3 A" X% y. E          }
8 Z% G' b  Q" t1 {5 {           k = (k - 1 + queue.size()) % queue.size();
! c" n/ D; [+ \/ e, Q4 T. c$ |      }
' j( W6 B( H. x2 t4 p* i; o       return result;
4 n  r! |7 W1 C6 |" a6 j9 Y  }7 i( b! C3 p$ W& G+ W
}: D: M; `) _/ g

$ c3 o- ^* L5 y8 ^5 }【 NO.2 反转偶数长度组的节点】7 E( Q9 K" e. o( o. c

# [: l5 @' Q; i8 v解题思路
2 E# ]6 X4 g# Y* a" H* T1 M" o数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。' }7 z$ h. t4 T- D
$ O6 ?  M8 h6 V
代码展示' }4 G& @; H1 L% x. h0 \& e+ C

6 j3 h# U) t3 m# o" vclass Solution {
. G3 X. e  W! t3 A% y: ^, ?" h* c; a   public ListNode reverseEvenLengthGroups(ListNode head) {2 y. e2 u6 ~5 N+ @& l
       List<Integer> list = new ArrayList<>();
2 D& Q( _$ S0 w5 a* i1 r8 z$ H( f       for (ListNode i = head; i != null; i = i.next) {# o; v# `. `! l5 o" S, c$ @
           list.add(i.val);* A: I# [+ g3 @1 T& f
      }
3 r9 G: y( l' D; r5 k       for (int start = 1, len = 2; start < list.size(); ) {$ u( l8 ]! \' s% o
           int end = Math.min(list.size(), start + len);+ O( B7 ?* A3 x2 i1 @
           if ((end - start) % 2 == 0) {
* R) x3 x6 _- d: p1 v# l) ]9 v$ u               // reverse [start, end)
! @! B, c" r# z5 \, s               for (int l = start, r = end - 1; l < r; ) {
/ |, i! y; \2 X! X" ?                   int t = list.get(l);1 k" W; q/ p8 ^* e- B/ V
                   list.set(l, list.get(r));
' H3 {+ w, _3 X3 z, a                   list.set(r, t);  G. k% Q5 ?3 W7 s
                   l++;. [) b# \, N% O* E
                   r--;" }. R9 k2 x" o9 I5 b7 H* v. [
              }1 g. _( o3 c' a: M: [
          }
' j. J& f0 o  Z0 {! W           start += len;
! @- \& h/ ^  ^           len++;
4 t2 q- F5 ?  ~) L* q      }
# B1 D3 X9 Q: B( D0 u* U5 z1 u# B9 @& E       ListNode h = new ListNode(list.get(0));
% {3 E  Z+ q/ Q% n3 x( e       ListNode cur = h;
5 K# ]/ z' H# H# e+ g       for (int i = 1; i < list.size(); i++) {8 K# I' P* v) f- u
           cur.next = new ListNode(list.get(i));
7 U1 J: s. D/ g; `: {4 I, A           cur = cur.next;
. u7 N3 ^5 s5 i: X+ B( |' B      }7 }2 r( n) i( z' K# o9 @  s& i
       return h;( d/ M; k/ H0 h# y5 r9 y+ _$ D7 l
  }
( o$ |$ X9 i4 X( a# c  ]0 @}
: H% O, n7 x; ~% q* t# f0 p2 a8 V1 H* F% E
【 NO.3 解码斜向换位密码】% I' ]1 M* F. b6 [. v* P/ N
* m: }1 ]$ B+ X
解题思路
: B( R: i* I9 A$ h) m8 S9 [* ~还原出矩阵即可,最后注意将后缀空格删去。! M+ K  ~% _) d6 _) w7 K$ n
# _  L7 x: ^& _9 T
代码展示
( v4 w1 K6 S4 i  Z$ f& \
1 R/ o' Z- K& yclass Solution {* n; U& |0 y3 Q
   public String decodeCiphertext(String encodedText, int rows) {
0 J: L( m9 m0 R1 g/ Z  o! N       int cols = encodedText.length() / rows;
' x# g. ]! `5 D' m$ d2 P  H       char[][] mtx = new char[rows][cols];
) E5 X. e7 O5 Z; q6 b6 W       for (int i = 0; i < encodedText.length(); i++) {
4 N( D% Z, e8 x# U! m- c           int x = i / cols;( x) w4 o. v; L3 l
           int y = i % cols;; F( w, r& t# A$ U% O& c
           mtx[x][y] = encodedText.charAt(i);( i$ T' g3 N5 o/ K0 {8 w3 }& s+ R
      }/ D' K5 m# u  R. O
       StringBuilder sb = new StringBuilder();
" E2 {( ~* K; h8 k       for (int startY = 0; startY < cols; startY++) {: q- a' H' K* \$ D9 ~& {3 K9 _
           for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {  {$ A# x" z; L" }! l
               sb.append(mtx[x][y]);
5 c4 G- f& }3 K3 }& d          }1 \/ f. N" J6 W- `4 A* n
      }
1 K' R7 j. p' Y% O7 {5 E, J+ w       while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
# s- W0 Y& h1 J1 ]5 b$ R# g  ?           sb.deleteCharAt(sb.length() - 1);) v1 B# Z4 h/ ]+ ~
      }0 q3 \$ |, D1 C, h6 S0 n
       return sb.toString();( s, k! t- f2 o8 ^4 K: J# M8 r
  }
8 x4 Y' M* h4 c/ B/ B' R}% A8 _- W+ w8 r( I# n9 w9 e

$ A  V& x4 u% V* G
7 d& G: I$ g5 {8 ^$ U2 w/ T/ o3 X【 NO.4 处理含限制条件的好友请求】  e5 _: ]0 a" Z2 [5 \
* V4 w  i) r9 O! Q$ ~
解题思路0 V# d' Z# a) Z3 x; x' f8 W5 d
并查集,详见代码注释。$ T+ x3 W, O/ b: A# X7 X2 |
) Q6 ~  x3 H" V: G% U% @6 t
代码展示2 b2 _2 K. i0 ~' {. K

& B1 p- n4 p& \3 \0 Gclass Solution {
& v% G/ g1 w+ M. R" \* j   public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {: A, a, i- n  t2 D: d5 \
       boolean[] result = new boolean[requests.length];; {6 {. ]$ J' b* L( {: t; X
       // R[i] 表示不能与 i 做朋友的人
% ~8 S4 Y# H8 ~+ b4 p# S1 Y) ~       List<Set<Integer>> R = new ArrayList<>();
. v* T' s; v3 ~+ L; W       for (int i = 0; i < n; i++) {
- u# Y6 T6 b* S0 s           R.add(new HashSet<>());$ P0 X' B& g' g( Y
      }- n7 l% ^/ ?9 J6 V
       for (var r : restrictions) {
& d" j0 [( i+ J/ f  j; ]: f* }           R.get(r[0]).add(r[1]);- K) t9 t" s- N) K8 W
           R.get(r[1]).add(r[0]);
! H1 |7 U4 w9 A0 I6 W) V1 L/ G      }, t0 T$ O2 I  X( P+ ]" j
       // uf 维护间接朋友关系
  T5 G' u* H, d9 g2 G. r       UnionFind uf = new UnionFind(n);
7 `* u) S/ {7 g8 d* Y) W& B       for (int i = 0; i < requests.length; i++) {
# p5 W8 T$ w7 W* x7 Z           var r = requests[i];6 b  `8 J' Q4 S1 V
           int f0 = uf.find(r[0]);" e4 Z8 z9 T# @, y5 j* B! v
           int f1 = uf.find(r[1]);
, ]5 T: b" H1 j6 @/ e& t0 ^2 k; x           if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了, q' \$ c+ X8 S+ I
               result[i] = true;7 `6 m, O/ R  `4 g: A; {# I
               continue;: L, L1 Y: ^  b
          }
% c9 A6 _4 @$ F& G9 C  U           // 由于我们总是将限制关系合并到根,所以只需判断根节点即可# Z, }/ M+ I. Y* j
           result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);) c3 Z4 f( ^! i- ^
           if (result[i]) {
! x6 {9 U, H3 ?% h6 k1 Z               uf.merge(f0, f1); // merge 后 f1 将成为 根7 X& M$ |- x5 m
               // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
% e. w# L$ r# Y3 ~* P5 T               R.get(f1).addAll(R.get(f0));0 a8 E3 |6 K. g! v& E8 L
               for (int j : R.get(f1)) {
7 L% ]4 s& z9 j' [( b                   R.get(j).add(f1);
1 D. _; ]$ @1 Y" F. n8 B              }: c. A2 {. g& q3 j
          }
" m, X" d5 Q- m# q- {; H9 D      }, n# V: c, O4 ]) S( v6 d# ?
       return result;
6 x3 Q4 M- N3 E( y  }% S5 @! B( `: V4 o3 k  @, O" `7 r, S
}
3 V( N! g/ }3 r: B7 ?! N% V# a4 f. O& o! _* g
class UnionFind {
/ t8 B) w- q9 D8 |  U: l0 p   public UnionFind(int size) {! Y; g$ d7 U# A0 E9 U. e* c4 d
       f = new int[size];% y. c& \3 _0 v/ v4 D  {" i
       Arrays.fill(f, -1);) u+ W- f# [" V' I% t
  }
6 A: C4 V. V9 N* Q, \' l, t2 i% c% r$ R2 ?, l
   public int find(int x) {
$ k5 v  z) ?1 R7 _" H       if (f[x] < 0)
. D0 B( L, X8 m) V/ b4 F* K           return x;& Q# I+ E' ]: L
       return f[x] = find(f[x]);
% M# x9 o' {. r8 m7 z1 E  }6 I/ b9 s* f' X- p. }7 Y$ |

5 |$ L( \, N$ E9 T4 ?   public boolean merge(int a, int b) {
2 H3 f6 s! |1 S. U       int fa = find(a);1 l( d8 _8 G& T; }9 g
       int fb = find(b);
: Y/ d# v  y) ~+ }  c. D" P" R       if (fa == fb)
6 h# S- a( W- |/ ?           return false;
! c6 ^0 Q0 I8 G9 W       f[fa] = fb;
, h/ V+ P7 ~/ G4 b- f       return true;
3 R$ V9 C$ N- o3 }  }
0 A7 ]6 U( z  \' I. M
: z' G0 s7 e& B* w/ [: j9 }0 i   public Map<Integer, List<Integer>> sets() {
5 Q( ?+ V4 H. s. Q- h  G; u* A       Map<Integer, List<Integer>> res = new HashMap<>();6 I- u, S6 G3 _. E
       for (int i = 0; i < f.length; i++) {
1 J' n  A- }: K3 n4 J5 B# ]/ M           int fi = find(i);+ u0 T" @, Z6 A6 _
           if (!res.containsKey(fi)) {* Q- l: i! G+ c
               res.put(fi, new ArrayList<>());7 k$ X2 E! L/ n1 K7 l; @& J7 o
          }
9 v1 ^& a6 N# {" l           res.get(fi).add(i);& b' Y2 Y6 ]1 U7 [# x
      }' D, J9 V2 D  ]
       return res;
' D+ l$ [- W  E& O% S- L$ x1 ^  }
: ^+ M* |* ]* T: N8 ]: v$ H+ Q* N( n' d* {
   private int[] f;$ O1 d1 y6 D1 }+ p, e7 k
}
0 y/ {* @  C' m0 \0 x' D+ D
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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