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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】$ n6 E4 H1 ]4 Q8 O2 n
- A- K  l$ q: J, R3 E
解题思路/ W4 z) |, I/ [, U. ], ?
签到题,枚举所有组合即可。
! R4 Y, h" |& g) R* J) [+ m& k; I
代码展示/ `. x8 @5 v2 X6 z% y$ k
5 [# W* J& o3 l4 w( K9 I/ y
class Solution {' q3 d7 f& K4 `& N+ ?
   public int[] findEvenNumbers(int[] digits) {
' x8 ]4 w0 ^- f# A       Set<Integer> result = new HashSet<>();) v1 k" O1 E( \: A$ B+ u# I
       for (int i = 0; i < digits.length; i++) {. N9 t/ r3 s3 g9 E4 p4 S  s; B
           for (int j = 0; j < digits.length; j++) {
5 n8 P/ p/ w) C6 k9 b2 m               for (int k = 0; k < digits.length; k++) {2 K, L3 r/ _1 Z9 X, K  Y& L5 {+ O
                   if (i == j || j == k || i == k) {! l2 i# q+ d8 U, h- G
                       continue;- h6 Q3 E3 O6 Z2 Q6 Y$ n
                  }6 O  \2 I& T% H
                   if (digits[i] != 0 && digits[k] % 2 == 0) {
1 h- `3 ?8 x  s. f$ [                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
$ k7 m4 |5 @: ]/ u& W1 b                  }7 P- b/ ~# z8 _+ u# ^9 E: N
              }% ]! z! u# V; c3 w7 v; ~. a. e
          }
$ ~4 Q. c3 }1 E1 s      }/ ]/ W% P) L2 E
       int[] arr = result.stream().mapToInt(i -> i).toArray();
* W7 c3 r8 Q) v$ l       Arrays.sort(arr);, X4 r0 P, t6 b6 s1 y5 N
       return arr;
3 c; y! x9 e! N  }
4 @4 x# k- i8 c$ t5 Q& r7 S}( I1 i8 c. C) j
' r2 B: s0 a; K% n/ g. l7 C$ R0 z
* g6 Y* i% |9 k0 I2 S: ~4 |* \5 K
【 NO.2 删除链表的中间节点】" v, r4 P2 f' ?; q) S! s

+ g/ z; k$ g. q/ j/ d2 z" b解题思路$ g! z$ D) w: X/ Z" z
快慢指针的经典题目。
* L/ W3 E0 e4 Z5 o5 Q  v0 W: c. V9 Y9 D8 y' L  |8 Q
代码展示
# Z: L- ~6 o' ]$ f  o, t$ L: T8 c/ V
class Solution {
, v$ O1 p# t4 x   public ListNode deleteMiddle(ListNode head) {& i% q: i; j; \, Q! T
       if (head == null || head.next == null) {4 C- ^* [# O: c- Y7 Y
           return null;' J3 Q+ W& P3 L! ]4 E& y9 b4 k# e
      }
% h" O& i9 b. |. Q       ListNode slow = head;
1 y; H( ^" s  E, O3 [       ListNode fast = head.next;0 T2 B( Y) y- G
       while (fast != null) {
& _, |% G: ]( M8 j$ ^1 J           fast = fast.next;7 |9 _% F( B9 j  s) c3 D% P5 E4 m
           if (fast != null && fast.next != null) {
4 ~, Z( H+ w, y5 S8 \               slow = slow.next;
1 F. ?0 n% K( n: D               fast = fast.next;  `* q3 w, K. i9 ~
          }! S4 b5 c! Y' O- z* ?
      }
9 @1 i6 H' N+ o! W- @8 H       slow.next = slow.next.next;
# v1 y% W* c% Y" l3 v" i$ L) g       return head;  M$ V/ q  v  u& X; ~( g( d
  }
/ \2 p! E2 \/ c- v, `# c5 Y}8 m! l$ _2 h: S
4 e( {) b! x1 u. d4 _2 j

; F, R" N9 i' o& C( [9 Y' ]% j. `& R【 NO.3 从二叉树一个节点到另一个节点每一步的方向】" [+ x2 t/ \2 K+ j& O

) u1 T/ H. E1 T3 V/ Z9 @/ h4 x解题思路7 O7 n+ Q, E4 {$ P' e
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。  e- A/ i* H% X: S5 [0 Q" X

& t3 ~5 u; f3 v代码展示
  C% d6 m, I$ `5 C2 J  K# a: T& ~  z! v
class Solution {
5 R0 o( |5 f; c: d6 d- K/ V3 ~   public String getDirections(TreeNode root, int startValue, int destValue) {
# N1 l8 @  Q, S6 P6 n       StringBuilder start = new StringBuilder();, o8 J$ @3 p( y: X8 C9 {1 \- i
       StringBuilder dest = new StringBuilder();$ H( }; E/ i" W2 h. D
       getDirections(root, startValue, start);
8 P0 K  M0 P( w. v9 @       getDirections(root, destValue, dest);* j( Q3 K. a1 D, ]
       int common = 0;
. h/ T/ k, q2 s; S+ Z! C       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
6 M3 p, w3 x( l% V3 B6 x           common++;
$ d! C5 t+ F: H% l      }
/ S# o- a1 M3 _4 o) ?, g8 ^       if (common > 0) {" ?0 Y# f( o# A
           start.delete(0, common);
! q& a: N$ S5 \* n           dest.delete(0, common);+ s* n! m1 T- W: D4 _
      }
0 ?: N' L. o4 r2 N7 g, F6 \       for (int i = 0; i < start.length(); i++) {
4 z+ V6 J' M6 y# U           start.setCharAt(i, 'U');
8 Q  w6 K  _8 F$ U* p3 E2 P( {9 p      }
7 C2 q' I( y# Y( W+ ?  w       return start.append(dest).toString();+ z6 I* Q0 q+ R- T9 m
  }/ Y  W+ M  g; S& H' W' V

: y& Y0 `$ E: m6 N0 w8 y& J   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
+ O2 M1 c; {0 L! c       if (root == null) {5 c% E2 b! O! Q1 }2 P, |' u
           return false;8 E9 s8 \7 Z% {7 @4 u1 L
      }
6 F# o1 V9 {4 y) U       if (root.val == value) {
6 P! P/ ?7 C3 y  F  Z/ Q           return true;
8 o2 V7 s4 ]3 R& t      }" P3 e" Z! C6 t) K" t& v
       int len = sb.length();
- A# K0 D: l  ?, `4 p       sb.append('L');
- I8 f+ g3 ^0 e0 \       if (getDirections(root.left, value, sb)) {8 P- F6 u* _( U, d3 b
           return true;
/ V+ E+ V/ @" Y9 V      }
' {: Z, D3 r) V1 N1 V9 |# ^2 P$ b       sb.delete(len, sb.length());
% C/ `) P" S6 N; L& P- X       sb.append('R');+ Q+ t2 E" D7 p( i  Q  J+ \
       return getDirections(root.right, value, sb);, y% k& b0 a, f8 K* |
  }
6 ^1 y( d* g+ q9 M* b+ D}$ s+ V" R8 l3 a  A  a1 I

5 A7 w/ c9 K: m/ {  _, w) A# M
3 w& C+ ?& O+ R+ Q; Y* ?% V. t/ g【 NO.4 合法重新排列数对】* A  x" m0 i5 k
3 U9 D+ ~( I9 ]# D0 I( ~% `0 v
解题思路  R1 G# C+ d. U/ e( v3 m
有向图求欧拉路径的模板题。7 S* ^; c# [% T! @

, [( U  k. \' L代码展示
& Z( i0 B0 ?0 R! J* Z9 E3 F9 j5 x
( K# P1 ]" e. N& y2 z  K& ?; q4 Wclass Solution {/ @) m; }' p* y0 \
   public int[][] validArrangement(int[][] pairs) {1 h- U3 v" h% a# q
       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();8 @, L6 ~% L2 g) T7 G
       Map<Integer, Integer> degree = new HashMap<>();
, z0 H, Q- [. H* r5 ~2 r. e       for (var p : pairs) {- _6 _0 i/ w8 H- D, e
           if (!graph.containsKey(p[0])) {* @! Y7 T4 t. A* t. I0 Z
               graph.put(p[0], new LinkedList<>());
5 e/ v3 B+ W* o$ |          }0 N) m1 u, B* D- ]% t+ `+ p. H
           graph.get(p[0]).add(p[1]);
3 O0 t% S" V6 X/ N/ n+ O           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);
/ W: p9 V  E3 D: m+ k           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
- ~+ `- z# W- H6 r% B4 o& y      }; r. I% t5 w8 D& k
       List<int[]> result = new ArrayList<>();
- h4 o$ X7 L/ z; S% C/ Q       for (var e : degree.entrySet()) {! ?2 Q7 D; i% l/ V
           if (e.getValue() < 0) {
: `) z1 E, ~* E9 A6 X; U; Q+ Q               dfs(e.getKey(), result, graph);1 P; x- S! Z, b5 U2 P% ]
          }
3 [% {" I' T1 B- [& b1 `      }
  W/ H% J$ c9 f0 a       if (result.isEmpty()) {
! A! ]# E1 q( X. F4 A- S  k( e           dfs(pairs[0][0], result, graph);
& X. Y5 N0 {4 q# j0 L      }3 x/ @; c% W2 c0 K1 u
       int[][] arr = new int[result.size()][];: R7 [$ `! m5 W6 L7 }: _+ ]8 |
       for (int i = 0; i < result.size(); i++) {
7 X0 \$ m1 r, I2 O4 p* c* j+ q           arr[i] = result.get(result.size() - i - 1);
, }1 f8 s+ @9 [: {! G, b. r1 z      }# Y& S; [  t: e/ v6 V7 W
       return arr;
! t  g+ q; J+ v+ ?  }1 S0 o6 @- n$ ^  O+ c+ [

( [4 @4 l3 q! F, D0 `$ T  L  e   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
% G; V5 `- x. ?+ E; ~       var next = graph.get(start);( }  W0 L4 |: t/ g! K8 ]! j
       while (next != null && !next.isEmpty()) {
3 L, {2 Y* G5 [+ O& ^& v4 [9 N, x           int to = next.poll();
0 P) Q* y" o0 z% }& T* [8 r           dfs(to, result, graph);
# N$ _: v/ H/ h' ]/ q" v7 e           result.add(new int[]{start, to});& f1 a+ c0 U6 C: J. X3 R3 h6 g
      }
3 y# R+ V4 ~7 N  }( H4 {% g/ Z* P$ ^3 d8 V  y
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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