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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】
, \9 \  v; ^% B' D& Q0 U% S+ U7 x1 y
解题思路9 v. p# ?' {, n+ ~: i$ |
签到题,枚举所有组合即可。
" V$ B6 [. }) F6 U9 H
# y% G( r& h% t- j/ @- X0 m5 i+ E代码展示
' I0 @) k3 r  H/ E# p7 s* h6 F
- Q* i/ v) r% T' o. K( r' Aclass Solution {
& ?  r( M: K. b3 t7 S5 {8 V" S6 K6 I   public int[] findEvenNumbers(int[] digits) {; n+ M* x8 z  I& R& P& R+ C
       Set<Integer> result = new HashSet<>();( t) p7 j8 T; q/ M
       for (int i = 0; i < digits.length; i++) {0 L  F9 @5 ?/ _/ u7 `
           for (int j = 0; j < digits.length; j++) {. W! X4 n& c- D+ V0 @, e
               for (int k = 0; k < digits.length; k++) {/ I5 L/ p  s" m8 R' k) v1 \  C5 @
                   if (i == j || j == k || i == k) {
. J8 ]4 ^5 L& M! a                       continue;9 c6 w" W! E3 C
                  }
/ K: \5 k$ x0 H! d/ S' W* e" g9 c( e                   if (digits[i] != 0 && digits[k] % 2 == 0) {
7 A( r8 H& e- v( h' r                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
. T" F3 j+ ^2 y1 P$ k: ^" N                  }
2 u* F2 o7 o+ \0 }              }
" f' w7 R2 H* G- n( P' z% O          }
" A4 N( u  I( `2 V; w6 K0 j+ t" S8 H, x      }
0 l; B1 b7 q( n2 i- W       int[] arr = result.stream().mapToInt(i -> i).toArray();7 _8 V2 ~! t$ G: z$ B* n
       Arrays.sort(arr);  G( W  J  u. n
       return arr;
4 e2 c5 U' _! X/ Q7 @6 V2 l; A# K6 \  }
8 i. W; Q; X/ L6 J}
4 i6 f9 Q" G  a! x# V! z
. ?4 w5 F* i0 r3 t- S! A/ X+ t4 d5 K6 p
【 NO.2 删除链表的中间节点】
( I& e  P, Y; h6 g: X: r1 l
( }6 ~  _3 a) y9 p7 E" \; v2 y5 }解题思路$ L$ S; e! x. g6 {+ F- |. S& a
快慢指针的经典题目。9 i8 g3 |7 T" A  ?) _

! c7 T- v* M/ ~$ E; r9 i代码展示
. d: b: X7 t6 `/ d% {; v1 D
( e/ E. @' g8 ?) O" o0 Qclass Solution {
( T$ s1 S+ r& P# k. S8 t8 Z4 W   public ListNode deleteMiddle(ListNode head) {* j0 @. [5 ?' M) q
       if (head == null || head.next == null) {
( \6 O$ X7 m+ D, ~# }5 }           return null;
- b, f% g- q4 J2 f      }
' d' J* T1 ]! t8 C; J/ W- q5 ~/ S       ListNode slow = head;. Z" Y5 i6 [( m. @- n
       ListNode fast = head.next;
! F0 x  I; V5 ?, c       while (fast != null) {& ]8 t0 i! j7 |" ]4 A7 u
           fast = fast.next;
) l+ ?9 w3 J8 G1 D2 p* u           if (fast != null && fast.next != null) {
8 t  \7 E; U( _5 l: y0 y9 U2 ~1 `! N% y               slow = slow.next;
; i1 d- V4 F( i7 a/ r# Q# C8 F               fast = fast.next;
/ [$ n, S, j3 }4 V/ H          }
+ B0 J+ H* U- b" m% R      }
5 A9 ?8 E: y" H3 o' Y( H3 H" w       slow.next = slow.next.next;6 l/ \4 B. Z) l4 X; _9 x
       return head;
; F+ t$ ~+ Z) m2 m1 E  }: x1 A6 o# o+ {. Q& Z
}
. d) G  |8 o( C$ f) V
3 P  E/ A* v/ i0 E8 [) g: Z' S  w( E, V4 m# \5 {  T* U9 A6 t
【 NO.3 从二叉树一个节点到另一个节点每一步的方向】2 l" `* ?" M" x7 j
( V+ {2 s( I5 c4 a
解题思路
/ S# ?7 X5 B  S) T分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。" b4 p* H. `+ Q9 {" T7 e

( n* H- w/ p9 f/ c" p( H% g$ U/ ]代码展示
% u# ?+ u# o! {6 S( Y: j% x; `: r
class Solution {( ~6 \( F4 w* `/ K4 a7 r
   public String getDirections(TreeNode root, int startValue, int destValue) {9 V4 t" M2 S( @6 Q  i6 z1 N
       StringBuilder start = new StringBuilder();* {7 Z- }& @3 a
       StringBuilder dest = new StringBuilder();
' G9 p. g1 ^3 W. u7 w3 n2 B       getDirections(root, startValue, start);: v# ?0 k( B# g9 U# S  f% a' M4 D  _
       getDirections(root, destValue, dest);% }: C4 g/ W  n
       int common = 0;
1 E# {& J8 ~9 v" \       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
" R3 W5 X$ v1 O2 m5 O$ g6 v# Z           common++;) X5 z/ A5 Y5 Y- z1 \8 Y
      }: v( \( A( ?) j0 f+ q
       if (common > 0) {
$ `3 q" v, m- ?5 v9 z5 h           start.delete(0, common);
5 }% y" p1 e$ w- Z& f+ g           dest.delete(0, common);4 T  r5 u3 q  v$ j; j. M2 e
      }
  n8 Q# a: h8 W5 T* L5 g+ R$ N# J       for (int i = 0; i < start.length(); i++) {" W3 D* G+ n9 d
           start.setCharAt(i, 'U');$ A: y; h7 j* W. g" k5 }  d2 e3 H2 p
      }
8 {/ B( l0 J% X9 I) Y       return start.append(dest).toString();1 I4 u# q5 b3 u+ v
  }2 x- c7 B* q9 @: R
) ~, H$ X) I( A
   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {" O- x# ?$ f; X: y: I! E
       if (root == null) {; m" R) f/ p# s& f
           return false;
. Z% E( B2 W, L      }
  a8 @: g# S& S       if (root.val == value) {
  A! m. t- K1 c' _  x( {           return true;5 T6 Q; l  x6 G) H; z
      }
" ^' f$ ?  s$ _1 d& J# {5 T$ _  a+ U       int len = sb.length();
# T" s* Y3 B& i: P8 F0 {7 S! k       sb.append('L');
' A+ A! k1 M4 r& \9 b       if (getDirections(root.left, value, sb)) {
  b& @- u" Q$ _4 }  o$ N1 h- F7 L           return true;
$ ^+ x9 |3 O5 J+ ^& y3 {+ S; S4 B      }
( J" j+ o$ A+ v7 i  m       sb.delete(len, sb.length());! ~7 P% w; ]0 |1 h" g
       sb.append('R');
6 f! c. f2 u) p- h3 \       return getDirections(root.right, value, sb);
' i9 C; K4 ^" L1 X2 u  }! L; L" P3 h3 `8 ^1 J: i4 V9 x) _! `# Y
}0 J, d* V0 e8 Y1 L- S& u

, ~- y  S! r- l- {
' f6 U( l% W1 Z- O【 NO.4 合法重新排列数对】
; R# V6 t- o4 Q* m, O& H/ j
* j3 @4 ?+ |  Q2 T0 R2 c: x8 G解题思路/ `! G- J; l5 X8 l7 s
有向图求欧拉路径的模板题。# ]% t* n" v' H& H4 w) i

2 j  N9 U- Z! E, e# i) x/ l代码展示! @4 w) f0 _+ ]; M0 j/ Z
- b# i- S+ J) P0 _( O8 I
class Solution {6 J' l9 \0 h# i8 t0 @
   public int[][] validArrangement(int[][] pairs) {1 r! S) {; ^( v7 f0 C
       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
( b  o, m$ N+ r% R5 w       Map<Integer, Integer> degree = new HashMap<>();
3 ~& ^( K3 l2 W& x7 u( {       for (var p : pairs) {" I* V4 }( ^  L
           if (!graph.containsKey(p[0])) {) c5 k5 z5 O' \8 M: ~
               graph.put(p[0], new LinkedList<>());: k: W+ N# x4 L+ h) N4 D' t* J
          }. N& Z, D' j) ?9 O
           graph.get(p[0]).add(p[1]);
% `, _0 E2 T& a& s           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);- A3 X6 O* f' \! _( O9 D+ H
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);3 a. ~9 M/ ^1 e) B. n, {) {  a
      }& Q( x! D( C  q
       List<int[]> result = new ArrayList<>();
$ A3 X5 w6 ~& F- C5 @% s       for (var e : degree.entrySet()) {) n3 B" w) m8 p. r
           if (e.getValue() < 0) {
. ^! _# S5 \& K  q: q5 u1 Z) M4 `) j               dfs(e.getKey(), result, graph);
- f# {' B4 q" M( m& z, {; w          }' u2 z9 Q8 t( p
      }
7 B& {8 ^6 A1 |* O* K       if (result.isEmpty()) {
9 ?# W+ V" C% s1 r# t4 H' R           dfs(pairs[0][0], result, graph);
/ \$ x+ U5 |& H8 l' v8 u      }& E  y# N( T! J7 O, `! r! f/ \+ X
       int[][] arr = new int[result.size()][];
$ R$ p7 o& ]; q; u5 y+ x3 X       for (int i = 0; i < result.size(); i++) {: L' @5 y) H$ b# _9 E2 `: @& U
           arr[i] = result.get(result.size() - i - 1);4 n: H0 z9 }$ C& I% ~8 T) b, x2 c" N% Z
      }  ~& x% z: |2 E" c
       return arr;2 F3 w$ u6 b6 z0 a0 M: s% ]7 D, ?
  }
7 F2 }6 a- J; A+ l0 }  Y& t4 N& y( y6 U) I
   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {8 @( g) ]" B. s
       var next = graph.get(start);
& X# Q$ I1 Y; I' }3 Z       while (next != null && !next.isEmpty()) {
0 H3 M8 i5 y* x0 f& z' P- ?           int to = next.poll();, `+ M, m* x7 k' l$ D: `" `; g
           dfs(to, result, graph);
5 o$ z# r- X( K: v8 Z$ i: E           result.add(new int[]{start, to});% X$ o# Y& M) A( h3 Q
      }5 t$ F! I% G+ p2 u: p
  }
9 K# U, z0 w! M7 Y! K}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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