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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出 3 位偶数】. B6 t& X1 }. F' a) b
' A; u3 x: o7 |. G+ D, D8 X
解题思路
# g6 ~8 ^, X, k签到题,枚举所有组合即可。3 N9 L5 W- m: z' b

3 W/ I* l( X( _7 ?9 x' A6 S& h代码展示9 f$ X. x4 Y' H/ M9 s' ?" o/ g

0 t/ I2 o: I& @3 t0 o7 S+ ^$ @7 Yclass Solution {
. n3 v# T  z6 m9 P4 v& J5 r4 j( b   public int[] findEvenNumbers(int[] digits) {/ y& M% t, j5 ]' w3 D7 r) p
       Set<Integer> result = new HashSet<>();
4 x& V( t. Y1 o, G0 ~       for (int i = 0; i < digits.length; i++) {
  E1 N6 ~4 ?. A# k. P" Q           for (int j = 0; j < digits.length; j++) {. J+ s- Z$ {, T, t( o2 I
               for (int k = 0; k < digits.length; k++) {
% s% z7 Y9 J6 Z$ g/ ^4 V% N                   if (i == j || j == k || i == k) {
! [5 e# ]* Q# ]5 |% p7 W                       continue;
! \; \9 z3 C2 s" @; n, S5 b" o                  }
- f: Y7 U- W7 q                   if (digits[i] != 0 && digits[k] % 2 == 0) {' k5 \3 S. ^8 p! A9 c8 Y
                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
( {9 S  ~/ A$ t! T( `8 h1 P                  }
4 ]# ]) r9 ~2 Y7 C              }, @" l# _4 k" b
          }' R0 F$ n' H, h& N; a( l
      }
8 `: B: }8 N# \3 G, Y& T  O( m* j       int[] arr = result.stream().mapToInt(i -> i).toArray();( u+ s% ^2 t, R  K% o
       Arrays.sort(arr);+ \3 f. D7 h% `; Y5 v+ ?% L5 k
       return arr;: n' c. Z4 P3 o( G6 V
  }
4 D  ~# `5 I1 Y1 F. h( N2 E. Q9 Q}
0 R: ~+ ~% D: o3 q1 _' C
- `# V2 N; c8 O: |( y+ Z
5 f" r( U+ v. c0 I7 |7 m  a- r【 NO.2 删除链表的中间节点】6 u, [, l! E1 }$ K

) S* l3 K- U5 _# o( {/ k解题思路
1 d3 ]3 s8 y2 ?+ N6 d快慢指针的经典题目。' i. J9 f6 h6 M

/ I2 i3 ~; q1 N- C  E: O代码展示
9 B# p% e' D0 O- M6 R- f/ F8 A
7 `' W0 [8 s% q9 m* y, L9 v. Yclass Solution {3 d; u3 H+ Q  B# N. s) M* R5 t
   public ListNode deleteMiddle(ListNode head) {
* I7 o* p! u, O2 T+ X       if (head == null || head.next == null) {" w$ c2 G2 ]( G  e  u4 p1 p/ s
           return null;2 V9 ?! p" f( p4 t8 z% Y
      }% M& {/ \8 P- V& M6 @& E, f* k
       ListNode slow = head;+ t! y& H! C% i* j! w9 Q
       ListNode fast = head.next;0 J1 u8 g: ?5 A
       while (fast != null) {
0 s4 n+ C- s: Q  g" _3 |, J           fast = fast.next;
7 W2 ^& Y, v  E* H& k- K           if (fast != null && fast.next != null) {
. W% H8 p0 T  F+ b- r  v- c               slow = slow.next;' H( D  [" }4 w9 ~2 o
               fast = fast.next;0 v2 {- Q, Z: Z: t- ]* S
          }
- a) P* D- j1 m$ ~: S      }
+ o+ W* j6 j/ M1 c0 c) t7 g7 r  y2 i       slow.next = slow.next.next;
; j% I$ t+ G7 p! [4 k8 M       return head;' t  k# b+ z7 K0 U; P, [: |" M) d/ i
  }
- k7 Z4 F0 G, x, `}
8 F. \8 p5 d8 u8 {5 g: M$ S# g* P  c2 d2 a1 o- h" e

  J+ ~0 ~6 R* H: @& J【 NO.3 从二叉树一个节点到另一个节点每一步的方向】8 R: a5 d8 q8 C
) A- s' M7 Y- S
解题思路
# w8 ?6 w& `- w: ^& f分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
1 Y" I: H; X% u" C" T4 r) _* \& ]7 z; a
代码展示
2 q7 i$ F6 R2 K; B5 a5 Z' e3 ]  T9 J+ j7 e) f6 c" r# g6 [  H$ p
class Solution {
* J8 V1 U1 d) l: U   public String getDirections(TreeNode root, int startValue, int destValue) {
( L# I% V9 c3 P1 c( H' ?3 y       StringBuilder start = new StringBuilder();4 o$ E4 o+ M6 g9 Y5 }
       StringBuilder dest = new StringBuilder();
5 l3 a4 ]" t2 M$ W* ]       getDirections(root, startValue, start);
! C$ x2 V+ V+ F& c0 G( {       getDirections(root, destValue, dest);. b6 I$ P- X+ R( m# r
       int common = 0;
3 q% a8 f- t% @$ }" y/ c       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
0 h0 `6 E3 L$ B# [/ H3 ?9 O6 a           common++;$ |4 A6 o0 W) w+ ~& c
      }
7 h, C# x- X4 d( f$ M& _       if (common > 0) {% @: A! y9 A& ~9 S
           start.delete(0, common);
5 a# P$ S9 O7 f2 s$ H           dest.delete(0, common);5 v. i! {/ Z+ u3 j8 B+ a) C
      }
1 u$ A( g& `( i9 h       for (int i = 0; i < start.length(); i++) {' v! k0 v" }% R; N& U. D" P
           start.setCharAt(i, 'U');
/ D9 K- g/ d1 ?3 a# b7 B% @      }
9 [' Z/ Q* b: M' d, M7 C% ^       return start.append(dest).toString();
, ?6 n9 K  |2 F* F; m. r  }
* W0 d* E4 F$ l. i8 j$ k7 |- e% |9 P6 `
   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
5 l- G" U# a- Y6 s1 m- o) }+ K       if (root == null) {- }/ u$ w/ B2 X+ M' w. a! L! ^
           return false;
* T) k  |0 R1 k. I& y; m9 e      }) k0 f- N! L, }
       if (root.val == value) {
9 Z8 k, S% X4 f2 x; l           return true;, ?$ o3 m4 a4 M" ?( ?% f. Q3 ]2 X
      }2 g8 e  h& p, a  ]+ z# H/ m
       int len = sb.length();
1 w3 u9 z3 l3 C( T       sb.append('L');
  [6 G  R  d+ T' D+ L       if (getDirections(root.left, value, sb)) {" p0 W0 t2 f, |
           return true;
" \7 `: G5 Z2 b) ?      }
2 w0 c3 ^  N0 u( y       sb.delete(len, sb.length());
7 e! _+ I+ }" \( {       sb.append('R');
& }9 A( ]. R6 |" u1 O3 c       return getDirections(root.right, value, sb);
; @3 z2 ^- j0 U4 ~( a  }9 v) @! ~( S2 B1 S1 v) }
}4 ^) Q( X$ c% n) \# a0 u$ F
  s9 F  ~' r- ^- P$ a& G$ S2 M

( z/ ]: ~8 ]5 `  Q1 A; |【 NO.4 合法重新排列数对】& [- G1 ?' S4 T4 k% f1 n5 T: ^
* I6 {8 r: l* A8 e9 y6 k9 w
解题思路
% e5 K- ~) e, q有向图求欧拉路径的模板题。
6 n& ]; `5 s9 L2 E
! y$ G7 Y, g7 T4 ^# q代码展示( r' J3 [6 O* B4 g

, I) ~' U+ k, x# ~class Solution {
4 d- X$ W+ h; J) P+ h  x   public int[][] validArrangement(int[][] pairs) {; I6 v0 D, |2 k: d5 l8 K3 R1 M
       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
; h; z. R- {% U% ~- |       Map<Integer, Integer> degree = new HashMap<>();3 M; K) B/ I0 p, N
       for (var p : pairs) {, j7 ]: f4 @0 Q% G. j; U" |! }
           if (!graph.containsKey(p[0])) {+ Y  H) @  S' q% G
               graph.put(p[0], new LinkedList<>());/ J: X7 w$ @4 Z0 \& i
          }
: n5 {! R/ s( K) ~           graph.get(p[0]).add(p[1]);0 l: O2 Y6 r$ |; q$ F5 n& F$ R
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);! i& g* l2 `7 ?. c1 k
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
# `8 z& R/ s( a. @$ j4 o, T      }  q/ M3 E  K; v' h) N5 q7 U
       List<int[]> result = new ArrayList<>();) S0 g0 X' ^% Q: W. X) P- W
       for (var e : degree.entrySet()) {, J3 W& B) b, L
           if (e.getValue() < 0) {8 r  K6 U+ [& B8 W
               dfs(e.getKey(), result, graph);
/ O4 M$ y  H& Z9 k2 r" K          }4 ?3 x% C' f5 W5 L! i7 X: _' U/ w
      }
: Q: t4 B* X' F( F8 x+ {4 I! @5 m       if (result.isEmpty()) {6 S3 k  D. W$ m$ s6 s, m* Y: _
           dfs(pairs[0][0], result, graph);
4 {" f3 l+ Z3 Y8 K      }
2 T7 {$ [2 [. Y. o       int[][] arr = new int[result.size()][];
9 C5 \* ?1 s5 O       for (int i = 0; i < result.size(); i++) {! [' y" D9 }& X* j  T$ ]
           arr[i] = result.get(result.size() - i - 1);: S; l9 g2 v2 C1 t
      }
" D, ?% h  F9 b+ g+ Y! D  o       return arr;7 w6 L# ^! \- x. l. Q. L
  }' i* J3 {" M3 c% _* D

, ]( Q% m0 H, U& D2 l" j* j8 `, Q   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {" |) }* K3 c, I, g- i
       var next = graph.get(start);, A, H2 c2 B- N: @4 I6 H% k
       while (next != null && !next.isEmpty()) {
' p& S  u( b0 \: n5 ~2 d           int to = next.poll();% T3 f5 T0 q- p2 R
           dfs(to, result, graph);
3 F9 |' c( {" ?           result.add(new int[]{start, to});
! D0 Q0 v3 T% S" z2 K; v      }$ w1 m& _# ]; g% @- p
  }- Q, W. v* n: k' y' _$ t6 F
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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