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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】) b6 m$ ?# y! a& `! \% W) v! D

2 Q) |& h. o3 }% G解题思路
8 C% s0 S. |- C0 R签到题,枚举所有组合即可。0 u, f; y3 N8 b; ]
, F7 s# q/ L8 t' K/ ^  B4 m
代码展示
2 Z5 S1 q2 ?  p  d
7 x  i  H2 f! T" v: @- j! V4 F6 cclass Solution {3 f6 I/ D9 ^6 W6 H- Z& _
   public int[] findEvenNumbers(int[] digits) {
1 l0 o6 k1 }. _; g3 a       Set<Integer> result = new HashSet<>();
% d2 t  j9 m6 E( ]- l# o       for (int i = 0; i < digits.length; i++) {1 f9 v% W. M& L3 }, M
           for (int j = 0; j < digits.length; j++) {
1 t' S" W* P- g) z: ]' g* W- g% Y$ x               for (int k = 0; k < digits.length; k++) {. ^" J8 Q/ ]/ }0 f
                   if (i == j || j == k || i == k) {; z$ R/ L+ a  c
                       continue;% _9 P8 S. U+ T
                  }
7 g+ }  N, H5 o9 P4 S2 \                   if (digits[i] != 0 && digits[k] % 2 == 0) {
5 M+ _! N- q! ~* f8 t                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);; [% ]) Q' k0 o
                  }/ k/ M5 ?" W, C8 @& \
              }
/ r$ k5 m  h3 S          }
' p& m, w" X# x      }
" @: W' l! b% z7 w       int[] arr = result.stream().mapToInt(i -> i).toArray();
& `2 Q; V2 f/ t       Arrays.sort(arr);$ M' p% f5 N0 Q1 }% @" U5 E5 P
       return arr;
( \1 I4 h/ `# }/ g* a  }
2 o0 N& f. U# h! q}0 j6 J6 R5 O' j

+ M0 A% A. r& Z4 I+ ^6 q5 r' c& R$ c
% m% ?: `5 X- `. U' Z【 NO.2 删除链表的中间节点】
* R1 X# e4 M! [' p# P' L, x- j, Q& |& W# M6 e' u% c* G
解题思路
7 ~, J. B  c! Q  @快慢指针的经典题目。; f3 L" r7 D4 T

) f% \& ^5 B5 y& ^1 S. B- M& a. W代码展示- y4 `- r2 J1 r! |

1 w: {0 i* ~% A9 P) Xclass Solution {5 V- _2 m. X7 @# M9 |, ?
   public ListNode deleteMiddle(ListNode head) {) z) K! v+ d5 H1 }" M1 d
       if (head == null || head.next == null) {& \6 }) C* e( Z6 ]% r
           return null;1 Z: C8 h7 J  E! }5 P
      }0 I, u1 b+ s& X* a3 S
       ListNode slow = head;
1 C" V) L& ?* ^) O1 K: z9 Z       ListNode fast = head.next;
2 Z% R# N  e6 k$ Y, C7 K       while (fast != null) {$ U* ^9 P9 g2 V8 z. i
           fast = fast.next;
7 |( {1 \$ m) E# L% m- o           if (fast != null && fast.next != null) {
& y) i3 I4 ^: \, |# M9 P- B" y6 T               slow = slow.next;* @/ k; ?* {) w" l
               fast = fast.next;
6 G' I0 w& ]9 G          }: ^6 T2 L3 S" K( \! S
      }
/ F* R/ r+ @; D7 ]( A! w; E       slow.next = slow.next.next;
, Q' y/ A% L$ R' {" Q$ _       return head;
8 F% n, a1 m3 }( v1 A2 z1 y# j  }
0 |- q% F/ g4 e7 a}& H6 H4 F- o; X# X5 p2 P3 B

- c! Q6 Q& t* y' ~& H, }( z1 k( B! E  @  v: y
【 NO.3 从二叉树一个节点到另一个节点每一步的方向】1 U" y/ k! y9 H! n

2 `2 G2 a' `' s" T" x# F* f解题思路
2 y& t" E' ], v, `8 d1 U分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
5 t! U! i; a- n% z1 E4 `1 t$ v# @& F- s7 X+ \
代码展示
/ B( q+ a* T9 s- E& T0 @5 G' U* L6 Q% z3 |( W- r4 G
class Solution {
. Q0 @1 j& ?$ r! Q1 T# g( T6 q   public String getDirections(TreeNode root, int startValue, int destValue) {: L' \7 d. ~, l& Y
       StringBuilder start = new StringBuilder();" Y5 C0 j( _/ X3 n8 }! V
       StringBuilder dest = new StringBuilder();  {0 b$ Z$ K' t* b( W9 ?( r
       getDirections(root, startValue, start);
0 c3 K6 i. S- M1 w7 o  P       getDirections(root, destValue, dest);5 a! r" s& F) I0 Q& {! @5 f
       int common = 0;( @" T7 L( y! s8 O% A
       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {# v( S3 t* q% }8 l; |! D& H
           common++;
6 c7 n. [: h7 H* d; Z! ~6 I+ t      }
& n4 a% g7 _: k1 O" A! @0 d* x       if (common > 0) {% x( x% w' R! ?+ j( g1 |8 C5 b
           start.delete(0, common);
$ k* m) K" J" o+ [) U           dest.delete(0, common);; {$ @- Y4 [& u
      }& k1 y9 c+ ~# o+ N& a1 c
       for (int i = 0; i < start.length(); i++) {
+ E0 y$ \; D) q( Q           start.setCharAt(i, 'U');
& J8 ?" N5 _& C: F& Y& q7 @3 s      }
$ ~7 J8 ^( ^9 h6 L3 p       return start.append(dest).toString();
$ R4 [. x: Z; a6 a/ u  }
" Y9 J% `" Z6 \) i5 I1 `2 h3 |3 c& ~! D) I( f& a
   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
. u0 d1 L& V# k) P0 p% c7 H& k       if (root == null) {
  K5 N  U/ `# l+ H2 o; ?+ r) H           return false;
- g2 P5 |' F  e" I      }
6 ^6 ]6 K5 k2 M       if (root.val == value) {
$ s# V- \7 M* t) L7 [+ d; U2 y           return true;, L5 h2 w! _$ B
      }. P; S: B$ X* n. u/ {/ s
       int len = sb.length();$ O3 C3 V$ N0 O
       sb.append('L');4 K! B9 n% U& a4 Q0 ~
       if (getDirections(root.left, value, sb)) {2 O2 Z( A* A$ e# i
           return true;
8 Z7 H# G& C( D0 X+ I# q1 {      }
( t3 C- ^# x) F" G( K6 e9 Q       sb.delete(len, sb.length());
6 r, F( n* k. F       sb.append('R');, `! a/ `( B9 ]/ L2 r
       return getDirections(root.right, value, sb);
0 [; g+ w) ]! b) f3 h  }
8 O$ A" R" n; }' _7 Q' D! j}
, ?: o4 `4 c( }  ?$ s  ^: W! O. P+ c% C) ^% T2 i7 `
; U3 Z$ W( H. N. `4 D+ o
【 NO.4 合法重新排列数对】/ g8 n) Y  Z, q  n# P# o7 K  D
; l4 [  J- z2 G! Q
解题思路- g. d' U( e0 b9 E1 I% K
有向图求欧拉路径的模板题。
: x8 p7 ]- V0 o! w. s
8 p5 y* N3 y0 ?代码展示
) y( ?) H# K1 R* @" A" ~5 j2 }- p; ?  m4 L' B
class Solution {
6 B; O  B& c( z9 Y6 U9 d$ t( _   public int[][] validArrangement(int[][] pairs) {
, g# x5 I4 K0 B* P       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
) @% S# r) k" f* [! i1 c0 @( z       Map<Integer, Integer> degree = new HashMap<>();. \- ~  O) K1 _; J1 K9 ~
       for (var p : pairs) {
; ]! V3 N3 j/ t0 c! b  _* W           if (!graph.containsKey(p[0])) {
1 L/ i, l' i( G) X% K               graph.put(p[0], new LinkedList<>());
' L$ _7 s9 ]- u- K1 J          }
+ K5 E/ \' p: t           graph.get(p[0]).add(p[1]);0 c7 Y2 g, e* y
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);) G4 F7 W/ K6 t# \( B$ m
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);( h- d; K/ ]" S- l
      }
. r' ]3 ?2 j1 Q1 {4 ^% Z       List<int[]> result = new ArrayList<>();
% X" }3 |5 z; j3 t! ~9 K; n; A       for (var e : degree.entrySet()) {8 w# U; `! \7 e7 b
           if (e.getValue() < 0) {4 Z! D& `1 e* u+ g2 F+ y
               dfs(e.getKey(), result, graph);
( [; t! e9 D0 x          }
" y( R6 C9 q4 m4 ]      }
" w3 ?" K* t# ]. b       if (result.isEmpty()) {
2 y9 a0 {0 }! C% a9 {( n           dfs(pairs[0][0], result, graph);0 u4 L! ?/ s) C3 |' T
      }- Y% p1 Q" r" p
       int[][] arr = new int[result.size()][];
6 e: p( X8 ]9 n2 @       for (int i = 0; i < result.size(); i++) {
. V* s8 ^: ^# @! F           arr[i] = result.get(result.size() - i - 1);( B% C( }1 t/ ?1 k
      }7 c4 a9 C9 _2 W& F' `7 z! M& W+ p2 r
       return arr;
2 F) _* \2 h# o  }
+ d7 \" e6 U* f% C
' V, [' Y6 j- J4 @9 ]- b   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
9 l: S2 G2 E' X* p) \       var next = graph.get(start);
, D$ E7 M0 u4 \$ k) Y6 H, m       while (next != null && !next.isEmpty()) {
' n# F7 Q6 t* n! g/ U" Q, m1 ^' a: e           int to = next.poll();
7 [1 \  x$ V1 r. |0 ~. U           dfs(to, result, graph);
2 t( O( m8 D; P           result.add(new int[]{start, to});" B/ i8 n' j: M2 h5 w. ^4 {
      }" H$ C. C% v, L' I+ N9 @4 [9 F! G
  }
; t9 |/ D* X, H7 r5 L}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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