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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】- y( A1 a. g) h6 e7 S
% @, B; g4 g  J) o9 j9 e+ E% S+ X
解题思路
( L0 v6 o% ?/ W, c9 |签到题,枚举所有组合即可。% c& ~" ]0 X# l9 |: F9 s9 u
$ K' X) k  {. ]! ?9 Z( s# ~: N
代码展示
$ P* d, q4 M/ K8 y5 N# F
& f4 H8 Z" Z5 o$ D& d" Cclass Solution {
. y& ?" ]5 l1 e1 P* E   public int[] findEvenNumbers(int[] digits) {: ]9 a) n( X+ U
       Set<Integer> result = new HashSet<>();; Q3 w# r% M/ e* N9 Z. M
       for (int i = 0; i < digits.length; i++) {1 c* U. h6 D' n
           for (int j = 0; j < digits.length; j++) {
5 |8 E  t- m- a- y! m5 `3 P0 a( r               for (int k = 0; k < digits.length; k++) {9 `4 n8 D1 p& \# q5 S" l1 W$ k: s
                   if (i == j || j == k || i == k) {# S' E6 x) F# j% Z% H0 @) k
                       continue;
! d8 o" C0 `) F' @2 ?8 g. Q& O                  }
8 E$ Z+ M' q3 t6 g                   if (digits[i] != 0 && digits[k] % 2 == 0) {. h/ a: p/ t+ ^/ Z$ X" g. x
                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
' f# B1 W2 Z4 t  q; R8 a1 b  e; d                  }7 L+ ?$ [5 c# L0 N
              }
+ j1 i! r3 X. o8 q          }+ G2 z3 T8 Y  j, R
      }  b. R: X- ^% l" _+ V
       int[] arr = result.stream().mapToInt(i -> i).toArray();! v& ]8 X4 C4 N$ H: X
       Arrays.sort(arr);; m: k8 E- n) d# n" r& i! F8 q# S
       return arr;
$ o) l  U9 k1 g+ V8 g  }
" C4 O5 H3 m7 c# f# o5 ~}! s7 G5 k- C7 Y" m% x1 q

7 E& m7 \; k8 ]* M% C& [( E
7 j) a$ _. m1 K) u" z$ D! {* e, Y+ }【 NO.2 删除链表的中间节点】: x  o# Y, ?" L6 H: z/ D
" R$ S( o# E# ]! g6 y2 s
解题思路
- C) a4 \4 _5 E1 P& _* `- w快慢指针的经典题目。
! a) h4 D; z/ {) ?# E8 t2 y) u' G. S+ e; r0 O
代码展示
$ t( ^4 |& q8 r- g' W; e+ C' N2 n% k
, G# Z! X8 @3 e5 h  eclass Solution {
" Y, \" U) w% T9 S( v   public ListNode deleteMiddle(ListNode head) {5 G6 c2 r6 J2 ~! o
       if (head == null || head.next == null) {0 \/ c6 L! A8 E
           return null;
$ g+ P2 g. ?* Q  ~* ~      }
* W7 b' d9 ^, A% T3 u; l       ListNode slow = head;
! X6 e( P6 ~3 C* G5 M       ListNode fast = head.next;
5 n7 m: a8 b7 Q, b2 |: j: I       while (fast != null) {, P0 T- m8 E4 a( G/ I2 h5 J
           fast = fast.next;
9 H7 |# A9 {# _; q           if (fast != null && fast.next != null) {
# A( b/ W7 C9 D* U' s6 ?, D               slow = slow.next;+ Q6 e  K5 G! W" a7 e1 y% R, l* J
               fast = fast.next;
* T+ R! S, w  a' _( l          }* m5 W6 M1 a4 C$ K
      }
$ {6 N. O) Y: i" ]0 J  B       slow.next = slow.next.next;
8 _3 S+ k) r3 R' P( u       return head;
+ X' c6 v8 [( {4 v4 l! U# [  }# {- p8 d5 G& t
}8 b" q* I) A& I$ T, x& e. \% x

$ S$ ]9 d. l8 o" V9 U" L4 [
9 b- `0 w0 p/ v: Z【 NO.3 从二叉树一个节点到另一个节点每一步的方向】
! W4 U6 G& e: `; l( C% P+ i: }/ T8 U- W5 H. G5 D* `) z
解题思路0 C/ w, M3 b4 x1 [  z2 m
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
- r- i! G/ o3 R% X* W  X, X6 v* V
% |+ s* J# F& {) j" B5 n' [代码展示0 |- W3 k) v: W" D- [
( W, K4 j3 m8 O7 x7 {5 v4 X
class Solution {
+ E8 T; o3 s  z   public String getDirections(TreeNode root, int startValue, int destValue) {
% d/ m3 i5 q0 b  {% L7 p$ n0 u; ?       StringBuilder start = new StringBuilder();
" z% n6 O0 T6 e       StringBuilder dest = new StringBuilder();
6 Z9 d6 q. H" _; T9 Y       getDirections(root, startValue, start);2 A$ @; X/ o; p& U# X$ c5 ~
       getDirections(root, destValue, dest);: q4 B5 m2 m0 f5 x2 K2 S3 l0 P) Y
       int common = 0;4 H! L9 L+ Q5 ^) U# {
       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
* R6 f3 v! `5 H' Q$ k7 o* p( a           common++;+ O2 K1 {8 A: D0 P
      }" U/ \: a: z+ I2 m+ @( Z4 Z8 ~
       if (common > 0) {& I' H0 |% p; A4 x4 x
           start.delete(0, common);0 w& O/ X: @/ N5 i
           dest.delete(0, common);
2 C  h+ D$ ~1 o+ p; i      }6 |3 j4 H; }& q
       for (int i = 0; i < start.length(); i++) {
4 t4 w- L! z$ H& ]2 {2 B! t           start.setCharAt(i, 'U');
2 j; u/ ^* }$ I+ Q5 v      }- T8 [; y) X* R0 R9 v' O
       return start.append(dest).toString();
: r$ e( B4 i2 a/ \4 `2 ^5 ?' x/ |  }) F3 H1 O9 Q# f& t( \4 x
# [/ r/ m, I! r. e: {/ I( z& G, t
   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {8 M4 v- u7 v# @0 f) Q
       if (root == null) {
1 s6 Q/ G9 o4 W- L           return false;
- q6 ]$ W" ?, W$ x      }
, _+ u+ E/ u$ k2 Z0 I2 N       if (root.val == value) {
2 L5 b& Y% A4 @0 P+ c  H. a           return true;
8 {3 B! M/ J+ I4 i      }
, ?0 @+ p/ ]# P3 g9 F       int len = sb.length();6 c2 y2 ?5 D' H" B* g; B0 A
       sb.append('L');( I+ `7 ?' Z2 Q; R$ S
       if (getDirections(root.left, value, sb)) {
3 [. m7 C- B$ Q) A: o8 I6 c           return true;5 Z% ^. ]6 k) q
      }
4 z) Y' c& T% \; Z& y" W6 q       sb.delete(len, sb.length());
6 o6 ^: X5 r0 m& B       sb.append('R');
4 r4 ?9 W9 S4 b2 r9 s9 {       return getDirections(root.right, value, sb);
! z! `: [) H9 ]% ^3 k( K  }' D4 F4 q: s3 T: v& l4 S; a
}
1 _. X: Z2 `* }9 [( p$ o& q
9 Z( k/ ]- U$ \+ c2 j* [' h! i; y& U5 L- B
【 NO.4 合法重新排列数对】7 a  s6 u: k' R7 B1 x; Q! T% |

! s& b8 s& E# z( O) F  Z. V* y解题思路
4 f9 P! }' B1 v有向图求欧拉路径的模板题。1 b* @, ~4 F9 l1 q. ~3 N

6 i5 Z7 E5 w$ I# @4 n代码展示
6 a7 b5 o4 m9 `  V- _( l- K" \% ?3 H7 ?9 h- e5 ^
class Solution {. A% f1 K& V& E1 e' m2 p) P
   public int[][] validArrangement(int[][] pairs) {
$ x% V' L+ c2 z3 E- b& a       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
5 G0 O' H' g! l+ I( u( W) D       Map<Integer, Integer> degree = new HashMap<>();
* Y8 R$ Q4 ^/ ?       for (var p : pairs) {
  R* y4 H9 f# _, d           if (!graph.containsKey(p[0])) {3 j/ ]8 V& t3 q$ N
               graph.put(p[0], new LinkedList<>());
" M4 R5 e/ z' {; j+ f3 a. ~7 D          }  S4 r# F7 Y# S6 L& y; N6 L
           graph.get(p[0]).add(p[1]);
# u: W3 Q7 A6 }           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);
8 j5 D; o& U( _  ]; `           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
  p: \; F' u+ s8 I5 H8 t; J( M      }- R. ?( q, A/ p& K$ O
       List<int[]> result = new ArrayList<>();
5 h2 Q! o- V6 U! V       for (var e : degree.entrySet()) {% i# Y8 n5 A8 |" _% v5 U4 R
           if (e.getValue() < 0) {
/ u( R9 z$ Q& W# G  P$ N               dfs(e.getKey(), result, graph);
/ c: [7 L5 p1 J          }
: @  O5 l- ^. Y) p      }
1 S6 l% M1 O8 a" l% W5 s       if (result.isEmpty()) {8 d4 D4 C$ O5 A5 h7 s
           dfs(pairs[0][0], result, graph);
9 @, t' A: l( L5 u) l+ g. j# h" h) }& f      }
) G% l; C2 M+ R( [, o7 m* ^       int[][] arr = new int[result.size()][];2 ^8 A! i9 M7 W$ J: \+ b
       for (int i = 0; i < result.size(); i++) {# m, N+ i' {# K5 S1 {
           arr[i] = result.get(result.size() - i - 1);
" N2 e4 }+ ^8 x+ Y7 O1 c      }8 A$ ^. B% B- V5 ~: m8 q" T/ l
       return arr;
' J0 {; F  }% U) r# I  }
5 Q+ h( t8 `2 A# F$ t
+ t2 N# Y/ a& F; }1 S3 l  D5 y3 {   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {1 u7 h+ s% \3 e1 p: |( O. a
       var next = graph.get(start);9 m& `! H$ S0 Q2 F) C9 W
       while (next != null && !next.isEmpty()) {
3 [: k! |$ n1 m& ?0 ], G           int to = next.poll();
, ^" {$ \/ k' n% x: r           dfs(to, result, graph);
& V# T( t* m0 j: x! f9 r$ C) v, |2 X           result.add(new int[]{start, to});6 x! |; @* p/ s6 x& \  h0 B; A7 J
      }
& K) l8 N0 g* {4 ]2 g  }; E7 _$ ]! ?0 V  J; Z/ T
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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