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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】2 S* O# p$ S* a. i6 h
. ~8 F: N3 f( z7 ^/ L
解题思路8 Z4 ?8 B: d0 @0 A5 ~: _
签到题,枚举所有组合即可。9 K# N) e1 V, @6 A9 l  I7 P

/ Y% m( V4 r, H% F+ O' G( b  d代码展示
1 Z0 K! g- n9 v2 |3 X# _! u9 q* Q/ B$ v' f
class Solution {. n- t# f  i6 g* a3 w. ?) b
   public int[] findEvenNumbers(int[] digits) {2 O6 ?, B: p, g8 s
       Set<Integer> result = new HashSet<>();
% ]1 \1 b3 z. m& m0 N8 n       for (int i = 0; i < digits.length; i++) {- ?% h6 |4 P4 B5 x& L
           for (int j = 0; j < digits.length; j++) {0 a' H0 P5 g$ S6 N: ?
               for (int k = 0; k < digits.length; k++) {
  O* q. m- T9 H* J% v                   if (i == j || j == k || i == k) {* M" A, U$ H) Y1 y& b
                       continue;1 m- Z4 m7 C7 c3 k$ K+ }
                  }
: S8 e4 p4 v4 i  x* |                   if (digits[i] != 0 && digits[k] % 2 == 0) {+ c% |! w3 ~  a( }& R
                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);9 a; |9 a9 Q! P( x# g' q
                  }
( q9 f# K( h% H6 N: B1 |5 a              }
9 c2 O3 j8 H' C1 e1 U6 {( a. i          }& {6 B1 q5 H+ {1 S) v0 p
      }0 W4 V( Y/ A; v. d7 p
       int[] arr = result.stream().mapToInt(i -> i).toArray();0 @+ }( g' v" e+ t0 M* A
       Arrays.sort(arr);
# Q0 A/ h& l( W7 f9 G, }4 D       return arr;
0 V6 U( s- c5 V! t  Y  }
5 ~+ P0 B0 Q2 y$ l}- A: R- s) x* O1 P) a; E1 q
2 R, v7 \1 i* L+ L: J/ G7 x% G

: {9 s6 F; P1 b* g% t【 NO.2 删除链表的中间节点】
; n# E0 `" ~$ I: |" v1 F% ~- Z1 \% Y# M/ d
解题思路
: ^" F' E* N1 n快慢指针的经典题目。4 n" U3 v: P8 [3 s! Q) V
. X" F# a$ y, s$ i& z. n* s# d! h; N, h
代码展示$ d! V* o0 L1 ~% X  J

7 ?/ P( b- w+ Q) h& ^  j" e4 `class Solution {
1 G8 z1 P3 b% B, n  {   public ListNode deleteMiddle(ListNode head) {0 n* [  w) ]1 u- r; I$ E
       if (head == null || head.next == null) {* w9 d' n2 h6 ~5 N6 t+ b4 J
           return null;% u* g+ g: S& ^! Y: |% H
      }- b: `$ ^, Y/ ~9 {
       ListNode slow = head;
& H. |: R- p% n( e, A7 l4 e+ x       ListNode fast = head.next;, B4 ]- j& X6 @
       while (fast != null) {
% k9 {9 t( L# U. U  O/ u7 T6 Z           fast = fast.next;
4 j; S9 Z8 B5 @, L           if (fast != null && fast.next != null) {
- t+ V, B9 ~2 w) O& w  d6 z. x               slow = slow.next;" X6 ~! }+ {# x, u" e% {$ w7 m
               fast = fast.next;9 K8 s0 K( C3 m& w6 N  @: ^
          }
+ Y9 h' @7 ~1 O) |: O, f6 Z      }
7 M& f$ q& j( J       slow.next = slow.next.next;- L0 W: H, h9 ^; L0 T
       return head;
/ \$ u! n( T0 }0 L6 w  }
+ A- x+ `" Z5 Y5 a: v- I}
) g! o* b8 H# A4 f7 l
* I6 x' {6 p/ N( ]7 V1 t2 W. q8 J  @% B" O9 Y' [
【 NO.3 从二叉树一个节点到另一个节点每一步的方向】+ }8 ^- |* e  Z6 X3 M

- [/ Z& M" E  u! o; ^( b1 }解题思路* F4 G$ M, Z& Y4 _
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。5 D8 u( i+ M+ e) f8 `3 |
. n- y! D7 [7 F7 Z' Q) l
代码展示
7 f4 x1 e* l- q4 E! u9 y* n! @; W% D8 ^- }
class Solution {
$ Y# S3 v. Z4 C   public String getDirections(TreeNode root, int startValue, int destValue) {
7 ~0 A( z; l, Z1 k* P" W       StringBuilder start = new StringBuilder();3 p0 ~* ~- V$ d8 m( \
       StringBuilder dest = new StringBuilder();6 O, q3 }2 c, ?& D/ Q4 m4 j
       getDirections(root, startValue, start);& M% s6 N! V. K% ^& F7 R
       getDirections(root, destValue, dest);. ]9 Q" k: t! K- Y
       int common = 0;3 w' f# K+ \3 U* ^
       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
  M6 Q( |7 `" X  d# T- S7 b" K           common++;# O3 S7 p2 [$ z. {
      }
9 `" h9 K1 \2 q7 |       if (common > 0) {9 n+ J& a; e2 k
           start.delete(0, common);
1 `" `0 T, |& x7 o1 @: j) ]6 F- q           dest.delete(0, common);
2 c' w. e4 J- E      }$ x  e. x, ?9 X2 U
       for (int i = 0; i < start.length(); i++) {
2 T, ^5 N5 Y$ H" L/ \4 Y4 ~0 [8 }           start.setCharAt(i, 'U');. ?& T; M* m& W, T6 I% T
      }
6 Q0 h- o3 D/ w- C       return start.append(dest).toString();
. `% r% l. U# b% A9 f  }
2 N+ _: x- F4 e, T# t4 ?/ |, h; S9 B, [7 h& d
   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {, P2 u$ }. `2 n
       if (root == null) {
$ B3 R* x! i' F% [& k           return false;
; A# U7 J5 v( f9 o+ g      }
  D. z( m* H0 Y8 H       if (root.val == value) {
: ^( v$ v6 Y& e0 b' Y0 M$ k: g           return true;- J) Y3 q( V! J
      }7 k, y* ]; O. X- g: b9 |$ y% u
       int len = sb.length();$ Z2 {/ ?$ i: z" `- `) v! L+ S
       sb.append('L');
# e$ @7 O$ S7 W/ \& N       if (getDirections(root.left, value, sb)) {0 r7 H% c& O% m9 v( E
           return true;3 E7 h- s. W. S& F
      }5 }3 D, {7 j3 ]  B# E8 _! r) Q) N
       sb.delete(len, sb.length());$ T! K& o# G  `2 v. F2 D* P1 ]0 Q
       sb.append('R');) w+ O& ?; e2 o4 e$ ~
       return getDirections(root.right, value, sb);3 J" _( I3 W) ~6 d# b: G# ^
  }# @# j  j  {6 L! Z, ^
}
. f  t7 y5 b5 ?; ^& F0 ?0 M4 P- U) i. E% `( \/ T$ A* C
( z" ]! F: S$ x9 g
【 NO.4 合法重新排列数对】  @" n5 `, p- _% p. R" \! E

- p+ E3 E( j) _  S: I解题思路
  Q& W& x2 x  c0 s3 s有向图求欧拉路径的模板题。
' ^! u; [$ |3 A% G, F8 ?2 b  a; R- M: o; s0 A: f* a# }' `
代码展示$ [$ C9 M& I! |  j" g7 Q3 K

: g3 E. ?% {$ }2 Eclass Solution {0 u' P0 Y7 r0 ~3 T
   public int[][] validArrangement(int[][] pairs) {
: g4 d/ [) ]: f* C5 N( W       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
+ t6 A* Y! ~( S& v" w5 h. u" Z2 b! P       Map<Integer, Integer> degree = new HashMap<>();
: P) P# H( z8 W& I2 I       for (var p : pairs) {7 y7 P# G0 `9 |6 M$ u0 e; ^
           if (!graph.containsKey(p[0])) {  X' |7 }* \1 L% |
               graph.put(p[0], new LinkedList<>());/ ~  m* A1 H' G3 ]/ m  @' W% V( z! j
          }
; B( U. ~' ?5 o: u+ k           graph.get(p[0]).add(p[1]);& @. h) p( e- |0 ]" d- E
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);/ g! c7 a, N  t3 l3 D! s
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
6 o/ |6 F9 W) \- q4 z      }4 x# z- f6 m; E0 |/ o
       List<int[]> result = new ArrayList<>();
! ^% N9 W  {; _2 e7 {       for (var e : degree.entrySet()) {
& w: I/ c) B5 O5 T4 f           if (e.getValue() < 0) {& r- J- j, u  k' B& \: V, B
               dfs(e.getKey(), result, graph);' u/ R  j* M; r# o
          }* A6 M' i+ @4 F2 J
      }" K; v' _/ r1 C3 F" M2 b
       if (result.isEmpty()) {/ s7 q  F) G, R) p5 \+ u8 [7 i
           dfs(pairs[0][0], result, graph);
, _0 `$ w$ l% U7 u0 H; }) T: m  o      }
- N/ _, s2 c7 G       int[][] arr = new int[result.size()][];
2 O! J$ N: m/ w; h* C4 R4 C       for (int i = 0; i < result.size(); i++) {
( P, E$ _) @6 x/ P5 t$ x- T           arr[i] = result.get(result.size() - i - 1);6 f& j( F$ [# l- d& I# p4 e, Q' E
      }
0 X! v5 x" r  {' M; N$ z       return arr;
# D2 |6 A5 W6 G$ x* O& t9 s  }
5 _, @! x5 A7 L; p( w
$ {& b4 r$ p7 ~! F8 Y; _& I   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
+ D1 K$ V# e( _, u, w" D       var next = graph.get(start);
" E- }' J/ g% i) J0 g       while (next != null && !next.isEmpty()) {
2 l0 V7 B& u( J% h" ^1 U/ z4 j           int to = next.poll();
. y( q  y0 N" J( y/ g           dfs(to, result, graph);+ c& @: V( J2 {
           result.add(new int[]{start, to});0 b, G! o3 }$ q( J& j* \
      }
% n8 H8 `% p/ s. H$ f+ @  }9 l+ |6 @# Z0 [& b; }: b
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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