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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】
$ D6 o" M4 w8 O" J2 F+ a1 [) h* c2 }- G9 h* a9 ~* h0 V0 ^! w
解题思路
9 ?6 p! ?& A, N* b3 a6 f签到题,枚举所有组合即可。
0 {% Y, a. q" z* G: o# o( A1 p
5 V. g3 X  _2 h; b代码展示
4 y% u  D2 k" ^& D  n  i4 A# }3 ^+ _* T4 q, D! Z
class Solution {" q2 y0 `2 U- F/ {; J/ W
   public int[] findEvenNumbers(int[] digits) {
  n& V7 }9 z8 R4 F       Set<Integer> result = new HashSet<>();
$ O& ]& U  V7 }; B6 G  Y       for (int i = 0; i < digits.length; i++) {/ K( b. v2 o6 ~8 J
           for (int j = 0; j < digits.length; j++) {
6 `8 G5 @/ w$ \3 L% l2 e               for (int k = 0; k < digits.length; k++) {
) _" f: `$ H$ t) b- A( C/ f                   if (i == j || j == k || i == k) {! e5 Q* M4 ?$ L: L; r9 O1 b+ z: P
                       continue;
( y- {( w! z* ~7 v' N                  }/ ?1 W& s9 |+ @+ s9 }
                   if (digits[i] != 0 && digits[k] % 2 == 0) {! j* g9 m6 J- S4 _- F1 D
                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
# w$ A6 `+ L1 b$ p! i                  }
" ^7 K; b$ c/ v+ s% }- {              }8 {5 u& w) u+ [% g" }1 S
          }
" O6 k- [3 |6 E' q( k$ j# M      }: ^$ ~+ ]7 B$ k* w. s/ j+ E! w3 o8 \
       int[] arr = result.stream().mapToInt(i -> i).toArray();, d0 p' s( }" E9 [5 n
       Arrays.sort(arr);7 \# R" Q) M" t2 P) }* V% @6 s
       return arr;
% X# e& x2 B! V  }
% K6 W! T) X4 P1 \, w7 u}
8 |6 ?9 [2 ~. [7 u- b+ D, z8 {% u3 }/ C+ P& J6 ^

& `) y1 H  ^- R8 l# A; c) r【 NO.2 删除链表的中间节点】6 m7 @9 w2 Z2 d5 C

- f+ Z/ W* L3 r解题思路+ k" l7 s! ~! _2 L6 G& w
快慢指针的经典题目。. n  R$ D. ^1 g/ T

; A9 u4 B! S# u+ C代码展示
; P0 ~! S7 p7 {5 p6 n6 I, c" B1 Z* n& m) I, K1 d
class Solution {# Q4 x6 V% v( C7 Q/ {$ q+ r( w% L
   public ListNode deleteMiddle(ListNode head) {$ ^- u( l0 b& U" F
       if (head == null || head.next == null) {9 @0 Z- p! f, t$ ^! Z
           return null;
8 M$ Y' _* h' e4 J; X      }3 W$ Y3 M# t" d0 |+ D
       ListNode slow = head;2 H# a+ \: t7 [% d; s+ g
       ListNode fast = head.next;1 a; u  {( J- [& ?) U8 ?/ h: N
       while (fast != null) {( x  V) e/ M7 u& e7 x
           fast = fast.next;
  [5 t( k! {2 l  j" v/ }  c           if (fast != null && fast.next != null) {# s8 v# f: y; N6 v( O' X
               slow = slow.next;/ d* ^9 U' Y  L* N; s* M6 a
               fast = fast.next;/ f/ }. n, M/ E
          }* U1 Z' w% ]$ ^3 \" J) C& m% @+ `
      }
% L$ e( [) X# Q& [" B+ i       slow.next = slow.next.next;
' J6 E2 z6 M1 Y) E9 f7 M       return head;  C9 _; _0 J! }7 V2 q" h, _
  }
8 b% s0 U. ?- B3 d) c+ b1 S}: Q4 r, X5 @$ }$ ~
) d4 W& m9 @, h  T

- ]% x/ t- o9 s( n% C【 NO.3 从二叉树一个节点到另一个节点每一步的方向】3 m; t. |( |! ]9 O5 D' a
! l8 X+ j* }  O# q! \6 a2 f
解题思路
- A: W# N5 k/ K  U! Y9 L$ n分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
! a( }# ~: [* I' m/ ^3 V6 m, ~$ k8 I
代码展示
; w3 f# J0 L- o  L( `5 _, ^2 t' P( V1 s* O! }; ~! T5 T/ Y
class Solution {
, B! ?, p! }6 w  ?   public String getDirections(TreeNode root, int startValue, int destValue) {
0 h  B- Y# _2 }. _6 t/ o2 ?       StringBuilder start = new StringBuilder();) D& V6 f- Y% T8 t# K
       StringBuilder dest = new StringBuilder();
" J/ l! L5 a' b' }+ x! O       getDirections(root, startValue, start);+ \) i3 x. {2 A6 S# t0 l7 c
       getDirections(root, destValue, dest);
* ]7 u! |) j" `) W1 x9 J! W       int common = 0;
! W7 U2 B7 d' e# G. A" y       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {1 t7 {, l* W( u3 }' v/ P( q- x
           common++;9 [$ d9 E) M4 V! g3 P0 Z. d
      }. W- e. t" }% O
       if (common > 0) {
8 M9 ^3 ]; h* Y6 M           start.delete(0, common);
$ A& ~2 }, A% A. Z1 p0 L           dest.delete(0, common);
- t7 \$ n# A, m* z      }6 n& K3 N, G6 O/ C& G8 R
       for (int i = 0; i < start.length(); i++) {3 b- N) h2 f' |% j' p3 q( F, p4 N
           start.setCharAt(i, 'U');
0 Q/ |2 E. v" D$ c      }
# g+ W" l+ E# \0 I8 Z4 S4 x       return start.append(dest).toString();
* V0 [0 x) @, C( C  }
& o3 p. l& ^+ D
! Y, N7 n) A% o1 Z. H3 y% J   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
( @# C1 u  X3 F" J       if (root == null) {; l6 q9 m9 l8 L$ A
           return false;5 i; C; y- i9 e2 T; M
      }
! |# z5 M' u$ R+ m( ^. J8 T! Z       if (root.val == value) {
. v3 [2 ^5 _) K           return true;3 x+ _$ r) B" c1 S# S6 ?: m
      }
* O, K+ D- y$ ?4 @' {! p       int len = sb.length();
( i$ ]! @* d% z, A+ A) u       sb.append('L');. Y/ f! g3 {9 E* j/ K2 `! Z7 J' Q
       if (getDirections(root.left, value, sb)) {
% o5 Z+ Y; }( h! ?8 |% X  r           return true;" l: v/ f& J$ {$ W
      }
' h$ ~+ B5 m- l       sb.delete(len, sb.length());. n4 L) s7 a/ |* Y3 L" B/ l8 O
       sb.append('R');
6 e; a2 |7 Z  a5 v       return getDirections(root.right, value, sb);% b3 i/ \: n- k# R9 F
  }
3 g8 S* x' n( j  v}
0 A2 i) S- g& @- b' b% V' e( C* @. p$ o# X# ~3 J
1 `; k' S8 a  k/ l  _! n* r7 A
【 NO.4 合法重新排列数对】
4 ~  l1 I5 |* i% h" O' x# O& B: [' n" N6 t9 Y
解题思路
7 ^; H0 f) J& X有向图求欧拉路径的模板题。% T' \' D& L) X9 f0 W1 N

7 ]" X3 k5 Z8 }代码展示
6 v3 b0 k* X. f9 H" Z6 m
! r- s5 {& e& l) y& E: Dclass Solution {
' L+ W. d. K. n& e% K   public int[][] validArrangement(int[][] pairs) {
0 F* ]: x( \+ ?( x5 x+ ]! |6 h. e       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();. q1 |9 h6 W7 V# R. A; Z
       Map<Integer, Integer> degree = new HashMap<>();
: ]) y1 T" {$ N       for (var p : pairs) {
# X$ E. v/ e( [4 Y* @  m- Y# l           if (!graph.containsKey(p[0])) {
) v$ _6 R% Y* O% U- i" y8 W" k               graph.put(p[0], new LinkedList<>());2 w" c% B9 b6 [6 I2 P
          }
' h( e3 _5 E: d& ~           graph.get(p[0]).add(p[1]);) X" H. G% k/ V8 T* b
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);8 T- I4 R+ p9 F9 k" g- u
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);4 R! Y8 g. M6 _
      }
0 E) }( g# L" w; X9 ]       List<int[]> result = new ArrayList<>();) Z8 D' j8 V7 |
       for (var e : degree.entrySet()) {) w0 W1 H* S3 t) S* u0 L" I
           if (e.getValue() < 0) {$ |( ]: u  ]5 H- S
               dfs(e.getKey(), result, graph);9 |- X4 D- T' v  H* ~, [
          }3 k1 Q; V6 S5 H6 ~, N2 ^2 ^/ l' y
      }
3 \" s4 S* i; `5 S       if (result.isEmpty()) {
3 _4 c& W3 {" H. \; O           dfs(pairs[0][0], result, graph);
9 X, i3 L/ j8 ?0 K  U' i. H5 t      }' }& `5 @& z6 a2 `3 s/ m/ Z$ t
       int[][] arr = new int[result.size()][];
6 q" S' R$ m( S) s       for (int i = 0; i < result.size(); i++) {
2 x" x. C! O" i! ?1 p1 ~           arr[i] = result.get(result.size() - i - 1);
( r1 J5 n5 ^1 P8 s/ {      }
! ?6 d  [" u0 t: |5 }  `1 X- L       return arr;
9 I% R! |+ k9 t  Z0 v- A! J) O& q  }
- Q$ K7 }. }0 f7 o  L. s6 f/ G7 |' O" ?! ?1 J! f
   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {% e2 @; b8 B0 e$ o7 m7 D+ b: i
       var next = graph.get(start);
, \7 R. i5 c+ P: C; G. V. {. T! w( i& v       while (next != null && !next.isEmpty()) {
* b! I/ r2 x# v3 v) `6 n8 f  H           int to = next.poll();
1 U5 K) e: |5 _- Y* G/ _           dfs(to, result, graph);
1 ]: Q- g6 G& K5 j0 k+ |" K           result.add(new int[]{start, to});
; m* e( h5 g4 e+ f4 _      }0 G" h/ y2 O$ f9 u0 P4 }
  }
5 ?" P7 O  M8 P* o$ [}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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