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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】
  D3 \& D. V0 D( u- Z" n6 I, w* @9 F, L# Z: V, C7 r
解题思路
: x9 M, U0 I& D2 d签到题,枚举所有组合即可。
6 C  n7 b: V5 o
5 ]$ |4 H9 ^, ?/ A  t代码展示
8 Q' F0 D- g8 V7 z, T, p; G, c) f( [# v6 n, A& H  e+ {4 i
class Solution {
0 x4 Q4 n% c7 c( D0 g# N   public int[] findEvenNumbers(int[] digits) {
% l/ I' v5 R, r6 b5 u       Set<Integer> result = new HashSet<>();0 d/ n3 I; X9 g/ u# Y- [# G/ i, P
       for (int i = 0; i < digits.length; i++) {
! B4 X3 p/ [! N, b           for (int j = 0; j < digits.length; j++) {
7 w  y6 z5 G" r. r3 P" U               for (int k = 0; k < digits.length; k++) {
7 m- d, Q/ _* K% w! T                   if (i == j || j == k || i == k) {
  j$ t/ Z4 }) k, @. b  D                       continue;3 M. k3 s( w+ g: t  U) q& Q
                  }/ M! [& S4 o# N1 N/ F
                   if (digits[i] != 0 && digits[k] % 2 == 0) {2 W& a1 s- f/ X  P0 @
                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);/ Z. ?. W" `+ _5 u- L: L" P/ `
                  }& x! ]4 K! a2 w. `5 {6 x- k
              }
1 C9 k( p6 _$ D& j4 ]: b          }7 N1 W9 c4 W& M6 Q* u* t" d
      }
1 L9 c9 l- n% e' _- [$ p       int[] arr = result.stream().mapToInt(i -> i).toArray();
0 S% D& D# a- q" M: I3 I       Arrays.sort(arr);
, w( F/ `0 d0 D# W       return arr;( r+ g6 b7 V9 C
  }
$ ?1 }0 l9 P1 S9 Q6 f0 d! |}' }$ A9 M0 H  l' T
3 j' O; ~! I5 Q8 N8 s7 [

' f/ x  x7 q! S* }  P3 O  g8 j【 NO.2 删除链表的中间节点】
* f( K1 w4 `6 }# E  k6 ]0 ?# l7 G9 L" |; Z6 y+ @; _: `( t
解题思路
9 h; c4 M: n9 A8 K1 i3 T; Q快慢指针的经典题目。
, f- M& D- [9 F# d! V/ N5 L+ d8 [6 Y- _
代码展示
& U& j( p. [- K0 ^' y4 D
. f& W' J9 }# I! u/ J/ R$ v5 Jclass Solution {
- V/ w8 t# y9 d+ |  T/ P9 ]4 [0 W: l   public ListNode deleteMiddle(ListNode head) {( ?- q$ {) M3 d& c# b
       if (head == null || head.next == null) {
; p- }8 Q! h" X) J" E; _4 ?2 N& f           return null;' _% |' e$ Z8 S4 P
      }0 ^( d  g& V; N
       ListNode slow = head;
+ J) b/ ^# `( D       ListNode fast = head.next;
' \6 l& Z& H, m: Q       while (fast != null) {3 i% n/ |. E( S$ O% h, e5 H# D
           fast = fast.next;4 f- y9 f: |9 E' b) L
           if (fast != null && fast.next != null) {. N: s) G1 c" }8 p# H
               slow = slow.next;+ u, n% a% D, }( `  f+ s* G' ^
               fast = fast.next;
3 p- J" V; H/ I% n* V, L          }- n1 p0 c. _+ M+ i/ H4 V
      }( x  [5 I) s9 c* L: i, [. R, Y
       slow.next = slow.next.next;# t* ]+ E2 E2 _) I, ?5 B+ h
       return head;- N  E8 M# F! l6 C, ]
  }
  E  C. {/ [" L}
$ J) A# B4 V3 U& ~6 q
  D" |9 W5 ], q  }* x) S
: L, z7 w  I+ N1 ~【 NO.3 从二叉树一个节点到另一个节点每一步的方向】; p  v2 N* _2 w8 b
& B1 y9 }3 ^/ r; k8 {) k) b% c8 o
解题思路: y5 S6 A* ~8 k. @8 v( J
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
( L8 a( @# I" ~$ h
/ A2 r- Y. x8 O, m# v代码展示
- ?! Y! {5 g8 m7 ]. w2 ?7 j9 X9 n
, m) ^( ^- M9 c& q+ |6 q7 kclass Solution {  C& P3 w$ ?6 J+ v" s: F$ l
   public String getDirections(TreeNode root, int startValue, int destValue) {
2 {; W& ?/ h' m       StringBuilder start = new StringBuilder();* u8 M, V  [% G2 A; v
       StringBuilder dest = new StringBuilder();
$ ^- H/ U+ c+ @$ o       getDirections(root, startValue, start);
5 w) x! I$ D% C4 `       getDirections(root, destValue, dest);
! k% F# k. N0 i- {( w- @       int common = 0;$ m# K0 g, U/ U0 L
       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
; _3 y6 p* p' t+ s! E           common++;
7 q% i7 E  b9 I4 R& [9 f      }
; Z% q2 e+ ?$ l4 E8 a0 X  v5 i( _       if (common > 0) {
; |+ v1 X  j6 G, ^; c           start.delete(0, common);
. T/ a& q) P# o8 }0 x1 b           dest.delete(0, common);$ {5 V2 i9 f9 z; z' ]  g0 S/ f
      }
' E$ `' s( Y4 M4 {3 N" ~) c$ E# D       for (int i = 0; i < start.length(); i++) {
- O* b- ~& R+ i, |# d9 G/ h           start.setCharAt(i, 'U');, r4 Z1 \3 i1 n- J  R
      }& K  F6 K, y/ z! M/ g1 {7 z
       return start.append(dest).toString();
9 I$ G9 s; _7 V' z2 q' `  }
: s# u; o3 T) }
2 O' _8 V6 Z+ s1 f2 T9 `" {   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
8 T8 h- H0 O, `2 b; p0 H       if (root == null) {
) C2 y# l: z* Z" @6 r6 f  u8 t& x           return false;
0 W- G( i7 y0 p1 r8 z% _      }& h* |" B3 a# P, W  p/ |5 U
       if (root.val == value) {5 e) L# n! m) k/ e9 ?1 o* m+ L3 q
           return true;' J' J: h/ L# ~3 B% \& Y& ?6 c& s7 S
      }# r7 N* ]7 M) }, R2 X$ ?+ i) Q
       int len = sb.length();
. ?+ F- I( W/ ?# R4 l, M0 K) {       sb.append('L');
- R9 V8 v) O2 ~       if (getDirections(root.left, value, sb)) {
' |: r, Z' ~/ }% W0 ?           return true;
  \: K" d/ ^% O) [- Z1 i: Z6 I$ s' ]      }
0 ^- i, ^) g3 C$ x% ?       sb.delete(len, sb.length());
! D* l& C6 }( w6 _       sb.append('R');
. b7 D% z( y2 D, |       return getDirections(root.right, value, sb);
2 Z; _3 v$ n0 Q) Q7 H  }; f# U9 K8 R8 t) Z, H) |2 W
}$ l; e* A$ U' {% l+ @
' r6 r3 B& C0 n; E0 x( @
' g0 [2 \" p. h8 c: u0 w+ i  }$ \$ X
【 NO.4 合法重新排列数对】5 j+ V1 v+ _& W0 `3 S4 p

- h  u% Y7 a8 s解题思路
! g& s3 i2 l* r5 _9 s- N有向图求欧拉路径的模板题。" N$ g) Z6 D0 J5 \, J/ A; i5 w
/ d$ q- s: S4 X7 y
代码展示
, v) r& r; m6 J+ o2 j0 m  g$ @& |* ]- A# ?& L0 ?: i
class Solution {# s1 }5 a/ C0 C
   public int[][] validArrangement(int[][] pairs) {$ H9 @2 X' [+ m8 F: d: f
       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
5 e0 A: h7 E' q9 ^3 ^! I       Map<Integer, Integer> degree = new HashMap<>();
: d8 ^5 X9 g/ ?) q& ~9 v  O       for (var p : pairs) {
7 q4 S4 N  B) J0 r- @           if (!graph.containsKey(p[0])) {
8 x0 W9 F. W, R               graph.put(p[0], new LinkedList<>());: o) p& h0 i  y" X; ~
          }' M- M+ B; s6 _4 S- U8 Q# g
           graph.get(p[0]).add(p[1]);( Q4 _" d+ I) R7 Y
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);
* m6 U. K4 g- `/ @- N+ W2 {           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
# F1 n$ p5 @$ H4 X" u      }
! j# |1 O3 p+ Y8 ~- O# ^       List<int[]> result = new ArrayList<>();
. X" q+ O  K( D4 {       for (var e : degree.entrySet()) {$ h7 q/ W' k' w4 L
           if (e.getValue() < 0) {4 s' E! O# t+ r( M* m( e7 D
               dfs(e.getKey(), result, graph);
; b/ t, ?6 j' U          }
# J% q* e3 d* Y5 }; W      }' K% n1 S- ^# w0 b, a4 \
       if (result.isEmpty()) {) u5 _% }. `: F/ X8 c
           dfs(pairs[0][0], result, graph);7 e: b  S0 h; j! i; _
      }
# ^1 i7 x( J/ K0 V$ ^3 L1 c* N       int[][] arr = new int[result.size()][];
7 M) ~& q! C6 L2 p$ r$ ^7 r       for (int i = 0; i < result.size(); i++) {" l( b/ M& D) M# E. _
           arr[i] = result.get(result.size() - i - 1);
( i2 ~8 Y& [- Z+ b      }: w, a9 T7 Q- ?- T# r+ \" h
       return arr;$ s; q6 Y2 Z- [  x! y7 M$ z3 q
  }
, c) \( O! l% x7 s
. L% m; q& K, d$ e( ?+ `9 n   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {: r% B+ V6 M% [, r" [$ n  j, J
       var next = graph.get(start);
8 e7 q8 y3 i9 g, Y5 O  L       while (next != null && !next.isEmpty()) {+ w* O1 k; B" p$ w
           int to = next.poll();
$ g& A  R, @9 H! ~           dfs(to, result, graph);# q6 F* W( S' H* u, |. P
           result.add(new int[]{start, to});
( P7 \7 I; y' ?8 Y9 i- p. w      }7 n  a2 u8 z4 i6 E; J: h
  }$ A) ?0 u0 d  q% ^8 f! X. ^3 o
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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