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

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

上岸算法 回复:0 | 查看:2869 | 发表于 2021-12-6 17:13:53 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】7 U6 j5 }* \: F! o" h
3 k7 F% f% X/ D  h9 j' H' A% V
解题思路% m% W& O/ f! a, M
签到题,枚举所有组合即可。8 e4 r* M) v% g9 D" ^

" k% Q) B' @6 q9 z6 n代码展示
* p; X3 ^5 R. j/ }* z% X( o; u9 A% E6 @1 v' L5 ?
class Solution {
7 f2 t8 r; ?! b# q* \   public int[] findEvenNumbers(int[] digits) {! q5 `" {8 [& A0 k3 g, m
       Set<Integer> result = new HashSet<>();
8 O4 D8 w% R5 \. v* x# z- d& h       for (int i = 0; i < digits.length; i++) {
$ b" S# r: F, q           for (int j = 0; j < digits.length; j++) {1 `: q6 H' s# n) w/ q5 M' {6 e* E
               for (int k = 0; k < digits.length; k++) {
/ w4 B6 P' J8 ]0 J% |/ o; o                   if (i == j || j == k || i == k) {$ y+ D0 V" Y; O" r" E7 ~8 {) N" j
                       continue;" V/ G$ e% _2 D: T7 ]
                  }
+ ^- l$ H1 o) U0 t                   if (digits[i] != 0 && digits[k] % 2 == 0) {
& }7 O, t) P, B                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
! l1 u0 a, P! E: j. ?. ~/ H: `6 f                  }) X* M4 b3 b) b
              }% Y$ h. M' H+ Y7 ]
          }
' _7 n  }" d( {" [, a      }
# c2 W$ a6 v" U, b       int[] arr = result.stream().mapToInt(i -> i).toArray();
3 i, v# o0 ~1 U$ a; f+ V4 C' N       Arrays.sort(arr);
0 J- v0 J2 d. A       return arr;
, e0 B; }2 O, I$ C5 }  }
* ?1 M. D1 H6 m. T; a9 @4 s}  U7 q8 [; X* ?4 ^) y

* B4 }/ N5 ]6 H% w/ v# {& o# L7 }
8 T8 ^; j+ D0 h2 h/ t! E9 E9 H+ T【 NO.2 删除链表的中间节点】: w6 D9 l" G5 R% k
- K8 U) y" j. p  X% _/ Y
解题思路
7 t/ L6 N2 N4 t% h& x, l2 {' o快慢指针的经典题目。  D3 Q, R: U. s$ T

3 R( u4 w# P; i5 X, K6 Z- F6 v3 ]代码展示6 {; I5 r. h# ]: C1 ~  {
9 v2 A' D5 a/ ~9 a  l0 C. ^# W1 [3 b
class Solution {
2 Q  m* O: \! y! `4 _, x8 W( @   public ListNode deleteMiddle(ListNode head) {
& R5 A' g! w7 Z% W% X) ]       if (head == null || head.next == null) {! t$ z/ u! n2 h4 l  {
           return null;
' i- q# e% z  f. Q6 Z      }
. w8 s% Z! W: {4 ]       ListNode slow = head;
# M# h" U6 w7 {) f8 m# ], d       ListNode fast = head.next;
( j; c. R3 y3 P* w7 n6 \$ E       while (fast != null) {6 W  i% B" r  \! s) m
           fast = fast.next;" v# M$ k& |! [' D/ F
           if (fast != null && fast.next != null) {" O" U1 F: B4 D$ @6 \% N# P+ q( j
               slow = slow.next;
3 ~! f  u+ p: j) x! K               fast = fast.next;
% n+ c4 O1 J6 i          }
9 n# @) p% ^1 {      }5 X& A) p. a5 ]( I9 u
       slow.next = slow.next.next;
1 f$ i+ v9 L& L( G* J' a; [# i       return head;
! c4 [; {7 A2 {+ E- |  }
7 b# S& ?5 A0 h& P. |; W$ v4 b2 p}
  ?2 I& R$ N. {" g7 O% h- d( h$ m$ Q& J* X: ]/ `% n" Z7 v

5 K9 I6 R8 X3 f* F9 y7 f% e" X【 NO.3 从二叉树一个节点到另一个节点每一步的方向】( ^1 ?( T* p9 r% a0 E$ r1 G

7 G8 g8 Q$ W0 B0 G& X! N. B解题思路
+ J! c% }+ z+ f2 [$ P分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
) R, R! t+ v) [  E1 E4 }
9 T" r! J# x; [代码展示
1 P7 y) x8 v4 V4 U( G7 j
6 p7 E$ ?  @: l( p+ p/ \. {class Solution {1 V2 Y' N+ h1 q- W# r3 B, R7 x
   public String getDirections(TreeNode root, int startValue, int destValue) {
1 c+ D' t# @3 L* K& Z+ I4 Z( F       StringBuilder start = new StringBuilder();
6 w& }1 f9 j" d; Q9 s6 o       StringBuilder dest = new StringBuilder();
- ~" }, b0 f- w* S5 K7 |2 l- c: n       getDirections(root, startValue, start);
. \$ _$ F' F) L( G$ R       getDirections(root, destValue, dest);
5 x' `  F0 ~/ i       int common = 0;# D/ k9 F) f& `' g- ]: O
       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
/ m6 u3 L( M7 k$ V3 K) x           common++;8 q+ l4 Y' v# Y9 S: a: c+ e
      }
  Y5 ~0 ^4 g4 `7 ^9 G  u& [       if (common > 0) {: w& }0 B0 s3 s. M. d% D+ Z+ _
           start.delete(0, common);$ n3 B( F, h5 S% ]3 ]% g  d
           dest.delete(0, common);) y/ i1 C$ p$ _2 z7 U9 D; z
      }
! q8 Q  G  A/ t) n$ }5 S- Z$ ?* P       for (int i = 0; i < start.length(); i++) {: F* q4 u9 ?6 C* H; {
           start.setCharAt(i, 'U');
; o! l5 a/ }% S8 A      }
  y+ I- D. Z0 Z. z       return start.append(dest).toString();
& t/ o+ Q( A5 Q! s- J  }( L9 U& a) @: C/ O

1 _0 p0 f" f& }  d$ _7 t   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
* D# j( ?$ h' c       if (root == null) {
6 S0 ?5 H+ B) n& {& L4 E           return false;9 ^- S! O) s) V, X
      }
9 b5 T: a. j, I1 c! J5 n* P       if (root.val == value) {1 O& Q5 Y# W% F, Z
           return true;
& w' O) j8 D8 N8 ^; c3 J* c3 O      }6 {1 S) P7 c9 F# x# w
       int len = sb.length();
% h5 W; Z- m5 d$ `       sb.append('L');
+ G3 d7 B$ Q# s       if (getDirections(root.left, value, sb)) {" O# X( M2 V& l
           return true;! f; P6 [+ h8 C) K( h
      }& f# [/ I  j6 Y
       sb.delete(len, sb.length());
  v- c$ o0 @! o) m  n) n$ L) U5 x       sb.append('R');
  h' ~5 m$ c! D. O6 B/ S( t) Y6 Q       return getDirections(root.right, value, sb);
2 e& {' u* Z9 |5 s' k( [' B  }$ r5 a; S, B. l2 ~" q
}
# n1 j( s* K' q& W: C6 u/ L5 b* o" e% X

  R2 M0 y; Y) p0 l/ u# h【 NO.4 合法重新排列数对】. |8 q$ J% h2 W$ }

+ @- V3 q4 N* c2 @* Q解题思路
+ m" H3 M  j5 E+ x5 J有向图求欧拉路径的模板题。
; \! t4 _& D/ w* P2 @2 I) {+ b$ G" Z; x4 h) W1 e
代码展示/ P9 P: \4 z% M5 v- L! Y# }' y% S
' N/ l: v& W4 n% g
class Solution {
6 S2 X3 @, ^, A. _# b  X8 b   public int[][] validArrangement(int[][] pairs) {
5 L- S1 W' l7 s; y+ c% Z1 r       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
" O7 A, ^$ J6 I! M3 x       Map<Integer, Integer> degree = new HashMap<>();
* o; q: y; X1 E! E9 _       for (var p : pairs) {
0 n% _1 j8 S! X; Y2 n% U' ?1 w/ B           if (!graph.containsKey(p[0])) {
4 \& O3 ~  C  c7 n               graph.put(p[0], new LinkedList<>());
. U, Q" V6 j7 F4 t- C# L$ _- f) O          }
( L, \. o( c2 L- a           graph.get(p[0]).add(p[1]);
0 v. ]2 q: p- Q3 x1 H+ z* {9 s% v           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);% H$ d) M; [6 g, b
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);2 P* o' o5 ^, x# s' R0 S2 x
      }
* m% g7 J7 k4 N3 ~! X       List<int[]> result = new ArrayList<>();1 H& v* l1 t3 c/ J; L" R' t% G9 S' V
       for (var e : degree.entrySet()) {
6 g4 `( i- v( O: g& m  g1 {) d           if (e.getValue() < 0) {$ [% k* l7 x% \' g# a
               dfs(e.getKey(), result, graph);
! q- q/ ?. [* k" ]+ J6 R& N          }% h: Q, j$ a' B. R1 B, F% w, K
      }4 ]) L! `/ C; }+ v& }) }3 s: P1 V
       if (result.isEmpty()) {
6 x! B6 z% ~+ v, O0 Y; C, _           dfs(pairs[0][0], result, graph);0 h( \  u5 x9 M
      }" U: \+ O$ i; B1 A: W
       int[][] arr = new int[result.size()][];; o1 h# v4 d, O
       for (int i = 0; i < result.size(); i++) {, t! u+ f: \, [3 C
           arr[i] = result.get(result.size() - i - 1);+ r: k3 Z3 T" v! d7 e
      }9 g  q3 c. r" t
       return arr;6 v, F, i) m  M3 Q2 {2 Y% P9 x% _! u
  }
0 [, Y2 P7 T% _3 G! q0 B
! A+ Z$ V5 E( c1 N( ?/ ^7 i   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
0 ]- z. E1 @. ]6 Y& O8 K8 W, N7 g       var next = graph.get(start);" r# y. K) A4 F( o& B  y! G3 T
       while (next != null && !next.isEmpty()) {5 L. ]2 U5 F* H$ x; D
           int to = next.poll();. T1 D# ?" L/ {1 [" y& Z' ?' S
           dfs(to, result, graph);& B4 g  f5 z) q- P8 e6 m8 K2 `& B. b
           result.add(new int[]{start, to});6 G# {# s$ f! i$ S4 ]
      }0 l: p9 k4 R2 n3 ]" `
  }
; F9 H7 @- {% }+ x# |* ?0 ~}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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