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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】+ b; A# F4 X. Q+ h# u. m) u

  |$ V- }7 O/ _& P  @9 m" F解题思路  \6 W" m3 k  U+ z1 H, T# Z
签到题,枚举所有组合即可。% P% r% v7 u, ^1 |/ }% _  o
+ S8 X/ \; C! C" o3 M
代码展示9 s: |4 U* W+ ~4 }' E+ ^
% i8 s9 T" O& U' x! G0 G
class Solution {
9 N+ v4 e# U% _) A& [6 j   public int[] findEvenNumbers(int[] digits) {
1 j! B7 I' J; R$ C& m( H% i8 W8 Y# _       Set<Integer> result = new HashSet<>();, M2 Y6 {  Q4 X6 T; c' Y) @
       for (int i = 0; i < digits.length; i++) {' [  x, {( [& c( u
           for (int j = 0; j < digits.length; j++) {3 v9 H4 A* K% w/ U3 v, l$ r& L7 `
               for (int k = 0; k < digits.length; k++) {* ~3 H& a( U' J: y. E
                   if (i == j || j == k || i == k) {1 A0 S6 C+ f: ?$ r, E
                       continue;1 J8 t" D/ C4 o- P& b& }! L
                  }
2 P5 u; V( s7 J& R! l0 x! A; U                   if (digits[i] != 0 && digits[k] % 2 == 0) {
; y7 b8 X0 I, z) f! B1 e1 F                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
, x4 q" ~# C' F                  }
& ?# P* \9 H% a- f2 N8 z              }1 l6 |9 y, |6 I! c( h( ^
          }
% g/ H: K- I6 s3 ^4 q$ c8 e- X/ r      }9 H% f. r* X# o- Q% R
       int[] arr = result.stream().mapToInt(i -> i).toArray();
) o9 m' v% F/ ?9 }: i# A. g       Arrays.sort(arr);
' i& [& ^% _$ u. z0 K9 x. m. B       return arr;6 Z# H  M+ ?/ u& o- M! t- q
  }+ r  ^0 v4 f) Y- T
}$ z# b8 k$ m8 s& W

/ `" I" B, d7 t0 a8 T* }" o
5 W& E4 m. i- c! D8 @) }0 U  \【 NO.2 删除链表的中间节点】
% J& J- @9 x; D- u+ x5 n* B3 b9 E/ k$ `) e+ ~
解题思路
1 E2 J/ _! `) f: Z快慢指针的经典题目。3 e' m: Z# }  F) i9 z" X

$ Y0 {4 @' q" ]! K代码展示  |' B7 a+ s* R) W# H3 P3 J+ e

1 k/ t2 u/ J( I+ q" Pclass Solution {) h/ R% F: A# ~1 l6 X
   public ListNode deleteMiddle(ListNode head) {' M! U6 d, l9 C' H  Z/ S5 K* v- i
       if (head == null || head.next == null) {: j/ a9 u/ s6 u( y
           return null;5 `4 W7 c. j1 e  b1 D& O& n( l
      }
. q9 q, p, W9 u( D) b       ListNode slow = head;/ T* l- r& y5 ]  L% z
       ListNode fast = head.next;
/ n* o2 o0 S; m2 I  O6 @8 O       while (fast != null) {
  F) ]* P5 [' Q! J4 r, T2 f  X* F: `           fast = fast.next;
7 x. R: I: E) N0 G6 ~$ Q           if (fast != null && fast.next != null) {7 i  z4 |$ K" }
               slow = slow.next;1 t, Q6 c0 [6 N8 r3 {
               fast = fast.next;
5 ]) n$ W" D4 K9 k4 j          }
5 y: N1 q$ Y3 w/ V      }% d1 V( \' }$ g* F3 `" C, m
       slow.next = slow.next.next;
6 p- Y8 f  G7 t# l       return head;
) X* u4 i6 `: H6 N  }: Y5 m. H8 N& s+ X. Q
}- @) f% O6 M  E! w9 r

# i. A: z5 h6 F: p1 t) }! o7 w0 @. E/ B0 \
【 NO.3 从二叉树一个节点到另一个节点每一步的方向】
! w+ F7 c7 l( P* _3 g: Q
, }6 N& H1 }1 Z6 Q: x解题思路; E: X% H$ ^0 k% t$ i  w
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
% D7 b- y/ e" ]% h! v2 f2 S( e8 i2 ~+ ^+ R/ q3 w; ~& [4 B% [
代码展示
# c7 |/ n8 p2 m$ _3 {$ w5 v9 Y2 q! q6 j$ x7 |; x9 X1 Y
class Solution {8 F/ P& i7 {2 O
   public String getDirections(TreeNode root, int startValue, int destValue) {
& {- u$ H: c, d* O       StringBuilder start = new StringBuilder();
) d" c7 a  H/ O; W# p       StringBuilder dest = new StringBuilder();& n, B5 Y2 E& |
       getDirections(root, startValue, start);& C- P/ |+ e: @  p
       getDirections(root, destValue, dest);) H4 g4 e" ~. D1 _6 V1 T
       int common = 0;
5 H: T( K: U' O/ p4 D       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
9 }9 W5 ]" _5 b! E' F9 E/ A; ^+ K           common++;
* Q+ S/ w. n( e1 R1 y" h- N* \/ }      }
( k% Q: _3 V, x       if (common > 0) {( R6 w$ V7 Y/ |5 U7 m$ A
           start.delete(0, common);! s$ d: `0 u, g
           dest.delete(0, common);
3 Q; q, V8 x* ~" J: V      }
+ Z6 Q) B% J7 m       for (int i = 0; i < start.length(); i++) {
- w0 _5 e1 A% n8 c% T6 {% i           start.setCharAt(i, 'U');
+ f/ ^, l. f3 k) v      }
4 @" L" F% G6 J: S( q5 n. l% X       return start.append(dest).toString();
+ O( `6 C/ M( j& R- a7 ?  }
7 s. h0 d1 p3 O( d& o: g
2 r  m8 G/ M/ L9 S. I   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
5 Y1 v: {  n4 }! ^       if (root == null) {
  P: q3 V, \  V4 M* K           return false;
% z1 F+ l& a/ K: F      }
* f8 B4 V; t: |  J       if (root.val == value) {
# T' W! U% C5 h- B! x& M  Q$ x0 `% e           return true;# ?1 D, [) R% w( N2 c: J- j' D
      }
& \" R5 Z, ^& D; [3 I5 H" o       int len = sb.length();' T# O. w. }- n3 W" A" ^# l
       sb.append('L');; M+ R( ?2 z  q7 c! G: ^$ h
       if (getDirections(root.left, value, sb)) {
3 l1 X# ^% i$ d9 X           return true;$ H8 @. Q, n6 L6 }
      }! {2 Y5 q/ S8 U+ v! f
       sb.delete(len, sb.length());$ k2 y* l* \6 k, ?4 n" V$ D+ B2 P
       sb.append('R');2 l' D; N: N* `2 a) W% }
       return getDirections(root.right, value, sb);
! ~) A- R  j& B2 s  }
# ~2 m+ u% b% N* s2 U: A}% w; i8 Q5 {4 x: P5 U1 S( N( J

% P0 \' H# y3 M
8 v0 d2 o; C3 N2 b0 F+ X【 NO.4 合法重新排列数对】. C) s3 l9 O7 m+ q3 R% F1 @
! s1 {: F  e& p8 s7 `) r& {
解题思路; E) e2 O8 }# D
有向图求欧拉路径的模板题。
: v) G! L$ v8 B9 X9 y
( }! `. [. X' K0 T! R7 ?. J代码展示
1 t2 p" [3 `4 A6 I2 B2 P* l; v1 B3 _$ z# z9 N+ b
class Solution {
$ z/ T! a) M+ F5 x* {6 \( {2 }% v   public int[][] validArrangement(int[][] pairs) {0 @) `  x2 Y, b
       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
' e8 D4 \. S2 J) y) s% F4 {5 V       Map<Integer, Integer> degree = new HashMap<>();4 _/ @$ @' u3 e4 k2 T
       for (var p : pairs) {
; k# H0 T3 [9 X8 }! `6 L' H           if (!graph.containsKey(p[0])) {
3 n# T5 Q/ [8 H: S8 c- O6 i               graph.put(p[0], new LinkedList<>());$ Z/ R. o/ ?- n4 {8 H- g
          }
2 k' L- \+ v2 Y7 X% ?  a- A# m           graph.get(p[0]).add(p[1]);; F" s! V  m/ T% S. g$ b
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);! ^$ `) m) u# n2 q/ k% r9 M
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);) D2 R8 K; _0 T3 N( ^+ p
      }" c. N+ _& F/ ~1 w
       List<int[]> result = new ArrayList<>();3 i& [9 v% \+ P5 i' H
       for (var e : degree.entrySet()) {
" `7 c2 |" D. T. B& y9 V/ p; {           if (e.getValue() < 0) {
  ?! w$ e; i& R% u               dfs(e.getKey(), result, graph);, Z; ~; z" f  w4 e: u2 |% D5 X
          }
: B$ V3 b* T! S" R; B& U; ~      }9 u& X9 X4 b6 e' V
       if (result.isEmpty()) {
( H& b2 k" B6 L3 I. r& X           dfs(pairs[0][0], result, graph);
, _: n. `6 n+ w2 O      }0 w7 `/ q! \; ]! O# M9 `" F; p
       int[][] arr = new int[result.size()][];
! \) E: T. L: ~9 z       for (int i = 0; i < result.size(); i++) {# X5 m' S- k$ K. _7 J, ~
           arr[i] = result.get(result.size() - i - 1);7 p+ E4 s! z3 O6 B0 V. B# ?
      }
7 ~$ K3 l0 P$ ^) p7 h, b* }4 `       return arr;
/ e, A" k' d6 r$ M1 R  }  K' ?3 a. {* [9 b& B9 |

6 \( g" R- H  ~4 ~9 A3 i- Z   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {* t4 U! g: b  T% @
       var next = graph.get(start);* v" @  C. M0 `" n1 J) u
       while (next != null && !next.isEmpty()) {
- a$ f8 Q% U5 x3 P" [           int to = next.poll();7 [2 \1 Q2 B8 Z# ^4 z6 P% T
           dfs(to, result, graph);
7 M+ T6 U  E. k5 W: b           result.add(new int[]{start, to});
2 J; T0 e2 i7 V8 M! w! Z5 X1 j      }7 s7 J% t0 Z4 b+ h! G
  }
9 @$ q# @1 k1 U% ?1 n}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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