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

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

上岸算法 回复:0 | 查看:2549 | 发表于 2022-3-8 17:55:18 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Excel 表中某个范围内的单元格】5 [  M3 `" p4 I; n6 b! F( C2 s

8 A. R/ X; w/ M3 c( a+ z, i4 x解题思路% M" F- J* [) |3 s' ?
通过 char 类型的加减法进行坐标转换。
# `" s: F- z/ r/ i# W3 F8 _: R& f" e2 K, o# X7 q8 F
代码展示
9 a* n+ ?) E$ {# j
2 x( B) C  ?( L9 X9 Bclass Solution {
( e& S' a- k2 l- c' o, H   public List<String> cellsInRange(String s) {
3 X4 u- n/ O8 q       int startX = s.charAt(1) - '1';: i9 Y' ?1 y6 A. i- g! o0 B
       int startY = s.charAt(0) - 'A';
% e7 r' K; L. l& X       int endX = s.charAt(4) - '1';
8 l3 ^8 T6 O& Y6 O# e! }       int endY = s.charAt(3) - 'A';! B* H: s1 E3 R' I# Q9 q
       List<String> res = new ArrayList<>();
+ X1 W$ p" W5 u5 k: Q- n/ r       for (int y = startY; y <= endY; y++) {9 @5 k# M) X3 d7 {
           for (int x = startX; x <= endX; x++) {
# u: C. r1 G0 E; S* O               res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));% m5 m+ y* o& W6 r5 B
          }5 f; o1 P& F% D) H
      }
% [5 v+ s: R$ J+ v       return res;5 G" |, S; Z3 A* q& y; b2 A9 g2 j4 K
  }& A; {! `. I" b+ U+ t/ T& P8 i
}& ?8 \9 G5 P! R
3 i4 a$ E0 Q: Y2 n/ H; K
* v1 F8 m2 I. F
【 NO.2 向数组中追加 K 个整数】
1 i8 _0 X9 S/ x+ {- R; W- q3 T7 n2 ?& x" d/ N5 K* m
解题思路* _4 O8 [) c5 |& o# K. ~$ i: y
给原数组排序,然后向有缝隙的位置插入即可。9 L" l! L0 a- ?7 m" b
5 y( b- D9 u9 [
代码展示% e) s% r4 u' h# t2 T* |4 c
9 c! {7 @1 v! V2 Y  r
class Solution {
; c7 q+ J/ |( A( o; o, H   public long minimalKSum(int[] nums, int k) {
2 i& V5 Q$ F9 U* S* R       Arrays.sort(nums);
- L1 E- p* x) F' }# K, r       long res = 0;
* I/ Z+ `( X. z# G( w4 V, H7 q       int last = 0;
  s) ]$ }$ S3 F# y       for (int num : nums) {
* k9 i" n  Z. G8 F+ `" j& D+ e           // (last, num)& P! t% H3 g9 ^: o8 D  B) x, I
           if (last == num) {
; n  N% L  o. i- V( }* L               continue;
; b, ^6 T7 s6 K8 n' j  e1 t! D' c3 n          }6 I/ j# ?1 f4 f( f4 h6 J6 s
           int cnt = Math.min(k, num - last - 1);
  O  ~$ ?( Y- }/ p0 Y4 U           k -= cnt;5 q+ B- i! m+ V: `1 q$ z
           res += (long) (last + 1 + last + cnt) * cnt / 2;. H* j, D( z& R  @, V  D% m" _
           last = num;, S8 L! _$ u2 t. l
           if (k == 0) {9 o+ P0 G- C5 R2 I
               break;  Q$ a& j) z( J: b" g9 W, ?5 x- l
          }+ S' F3 c( O: f
      }
$ Z* A2 b* i+ o5 {  g8 W' n       if (k > 0) {( d+ q% N3 K# a8 l7 U1 a
           res += (long) (last + 1 + last + k) * k / 2;) V' Y9 ?, W4 X# C
      }
" h8 z- s6 ^# |0 U+ M1 P* G, z       return res;
; {, X6 x  n3 x% ]# g* N- \  }4 N. W6 q1 H7 ~9 r
}: H# J7 t0 O& _5 G
: q; B& }/ M9 W; ]' L, k

, P+ f$ z+ O0 K【 NO.3 根据描述创建二叉树】: m+ \) X/ m# w( H$ ]6 {

7 C' r) x* L4 W% n" }0 c解题思路8 l/ ^1 U5 i; w8 v1 o( [& R' S% c
使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
6 X4 ]* p4 _% D3 ?* F, N- z8 H" E' D- X) c, k+ J
代码展示! U/ F+ a& z$ F! P5 x

9 h8 n3 n  d8 ]/ f2 |- S. fclass Solution {
5 l. J$ w; j- |6 `- z   public TreeNode createBinaryTree(int[][] descriptions) {
8 Q: [, x5 i9 O) c8 [+ O" U       Map<Integer, Integer> parent = new HashMap<>();
. Q' I0 U2 D, }  k( }6 k8 r       Map<Integer, TreeNode> valueToNode = new HashMap<>();3 V2 U" u( j0 g8 |
       for (var desc : descriptions) {, Y3 A( o" s1 `+ }+ o( k" X
           for (int i = 0; i < 2; i++) {
: G% o3 T/ L  z# q! F               if (!valueToNode.containsKey(desc[i])) {
! ~  F, _, F* s) S1 o0 i                   valueToNode.put(desc[i], new TreeNode(desc[i]));) q6 I: w2 |( N
              }9 |7 n, J! W7 t% o% X+ C
          }
  Z4 g$ z- l) @& K5 G% n           parent.put(desc[1], desc[0]);# ^& w1 G. n5 l+ N6 j7 m+ K
           if (desc[2] == 1) {. I- R. `% M* S+ z
               valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);7 h( r4 N. t2 W- _) G
          } else {
. @0 I% A. i5 H0 U  r) X               valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);6 f. _# u# a1 c9 ?2 N/ \4 a
          }
& V! r+ A/ v! s- c" F      }: O0 s$ ^" x* I
       int cur = descriptions[0][0];. |9 d, m  y5 U( _- C
       while (parent.containsKey(cur)) {
. ?/ n- R/ j* H& |# G           cur = parent.get(cur);! P& N% Z+ j1 z6 L1 {0 q
      }0 u1 s$ q2 d4 i6 N1 u
       return valueToNode.get(cur);6 V% b, u! ~* A4 F5 x- V
  }! t3 o3 j5 |! W, r' v7 E
}6 h( p! n- L1 I) y

2 P; q& i: U* \, _; G6 X【 NO.4 替换数组中的非互质数】
- M8 N/ e& k' N" k) C
4 [+ v9 x. e5 K2 Y6 M解题思路( d% }4 M$ O2 }' f* b! h
正着遍历、反着遍历,直到无法再合并为止。详见注释。
1 x: _5 X9 Q' t% @' h) J$ H* V/ _" Z2 `: G: N; H" h( }
代码展示3 I6 g% M/ e$ d  Q0 E) \  g

* m* F8 @+ k# b. I" ?- i- iclass Solution {4 E% p. Y+ \! {4 f. b1 u
   public List<Integer> replaceNonCoprimes(int[] nums) {
* W4 i: u+ W6 l7 m       List<Integer> list = new ArrayList<>();
1 m3 P* e- z1 y4 c3 B) V       for (int num : nums) {
# p# I" l5 b2 Q7 A) W5 O: [           list.add(num);# P) t9 T' y# ~$ w: w/ a7 f
      }+ R; L! s# \. p2 L
       while (true) {
/ O- B; _) \0 p) g/ S6 b" q. v           // 正着遍历,合并一次( M5 b: s% k% e" r$ l0 F
           List<Integer> merged = merge(list);
/ \' M5 [3 ?% L1 o           if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回4 a! e8 D. u1 \; I
               return merged;
5 m8 h9 z4 ^, o% T3 W( Y  i9 B          }0 c# m+ b. R( p/ C3 ?
           // 反着遍历,合并一次4 z' t6 ~5 I( g/ w. N9 ?0 m
           list = reverse(merge(reverse(merged)));! [# n1 E6 V# l8 z7 b
      }. w! ?4 T7 q/ v5 z( ^
  }
! W4 a8 z% c% ^: V1 G3 ]0 X, [
7 [" r# I. z0 w9 Y9 B: Z: e7 g. K% i   private List<Integer> merge(List<Integer> nums) {6 F' Z" ]1 ?; ?
       List<Integer> res = new ArrayList<>();
: `; q1 N3 z$ i* f: F# W       if (nums.size() == 1) {
" B' e4 t9 ~. B2 a& W& z$ B           res.add(nums.get(0));
, {+ x  L! t+ a4 Y0 u  u           return res;
3 s7 ~1 v& y; H6 I3 c      }
3 _* @2 u: U7 W& w. H% R       // 一次合并中,令 i, j 表示相邻的两个元素3 k# a  a8 ?4 ^$ u/ q# ?* M
       // 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可
6 i; C3 O; K$ V$ ^1 Q; Z# j3 V) e       // 最终将结果 add 到 res 中
7 G1 k4 u$ W' ^       for (int i = 0, j = 1; j < nums.size(); j++) {" E  W: s1 }7 ]  L! |# J+ M' }
           int g = gcd(nums.get(i), nums.get(j));
. K: P( i4 L7 {           if (g > 1) {
3 N9 d/ V) W  B& L% ^3 A2 y6 r               nums.set(i, nums.get(i) / g * nums.get(j));
0 G  l7 o1 @6 U7 n7 k2 h* u               if (j == nums.size() - 1) {
# y( L# l& {5 E                   res.add(nums.get(i));
4 Q6 d+ K' U4 B3 W0 u4 L. K              }; {/ {2 z( d; q
          } else {
4 q% c- B; t7 i" r2 b' C1 P               res.add(nums.get(i));0 P% s! o" S% J) s! c0 [* s; O8 o
               i = j;% g3 E9 M  d1 D& C. a8 R
               if (j == nums.size() - 1) {
1 j9 l1 L: L( T7 y                   res.add(nums.get(j));$ q0 W( M1 z! \1 g+ V0 w) Z6 T
              }) A" Z5 z2 _$ G+ s
          }1 |3 m( H: E1 y4 v. _
      }
8 Z  G; h/ }/ a- C8 L; W       return res;. P# Y5 }7 E# e' U7 C+ @  |$ t
  }
6 h0 w: {+ |# G( {6 M8 t, g' t
; J4 B/ s* a" A3 p* I% B   private List<Integer> reverse(List<Integer> list) {
* X$ D" l5 b& S; m; a6 z$ F& ?       List<Integer> rev = new ArrayList<>();0 Z+ _. |& `" a  D2 |0 P
       for (int i = list.size() - 1; i >= 0; i--) {, g2 ^) E' O! G8 ?+ n
           rev.add(list.get(i));& R, A% ]4 m% h  s7 W9 k$ [; U
      }
. O2 e" u! R2 F- d9 @: A       return rev;6 x$ w9 ]8 |  m  G) U3 b5 W
  }' \& X* i7 D1 f: Q3 U- Q" P" L

0 h8 t0 x5 A5 ^& Q" n& M9 Z. r7 m, d& P! I
   private int gcd(int a, int b) {5 |8 Y0 _$ Y( k9 N
       return b == 0 ? a : gcd(b, a % b);
( D' W0 \' ~& b5 b( c" z  }. |7 E5 \" ~; I8 @  {/ X/ A
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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