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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Excel 表中某个范围内的单元格】
$ o7 L( g) M4 ?* a7 _* q5 j
9 a/ [7 R1 W' ?1 u* S3 e- N解题思路
" n* c. S4 Q/ @通过 char 类型的加减法进行坐标转换。9 |( A1 P4 o& x7 p" q8 V, e
5 Q- W( h7 E% N& Y8 T
代码展示0 O; F, B: o: \# `! f# `1 H
) I( Q/ t) o5 x* Q. b
class Solution {% K' f% @0 b, g# h1 q: ^
   public List<String> cellsInRange(String s) {
+ G7 a1 s/ N9 n( [% ~" \  E" E       int startX = s.charAt(1) - '1';
) n9 L6 w) ^  g# b( z       int startY = s.charAt(0) - 'A';/ M- f  [0 Q2 B% ]
       int endX = s.charAt(4) - '1';
% ]0 v) _* ^* @* A% a       int endY = s.charAt(3) - 'A';8 O5 z) @  d& v# g- d
       List<String> res = new ArrayList<>();  @# K5 y3 a% r
       for (int y = startY; y <= endY; y++) {& W- e) p" f) f- X
           for (int x = startX; x <= endX; x++) {9 ?% ~; e( z% X
               res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));, z* I' Y; @# \9 F3 a# J* [% L) e- a
          }
5 R) `, P- a! y      }' \8 S+ ]$ R# C9 ~+ d$ w$ G) D( c
       return res;# u8 j+ n  e) w* j; L4 @
  }6 \, ^- N; U  |3 ]
}
" C* V; U2 V# ?7 @4 }) z, r3 J  w2 P% [0 k. G* d) S

4 v2 f8 [6 t0 `; v7 D' R+ {【 NO.2 向数组中追加 K 个整数】8 e/ `: v: D7 z/ ~

# f* U1 Q( @5 t% Z( o+ [解题思路! `. q) M) A: H$ p+ z* `  ^
给原数组排序,然后向有缝隙的位置插入即可。
7 S' Z/ V- D3 V, A9 P/ p/ ?
' M8 b* l) K/ }代码展示
+ ]1 U* J. C" m8 G  j, X2 X+ s. u) K: q
class Solution {! Y8 z2 D- e" R' n
   public long minimalKSum(int[] nums, int k) {- N1 a, }5 F5 S3 [' `
       Arrays.sort(nums);- N1 |, F1 p. A5 \& U
       long res = 0;7 o# c; X- e+ s, y) w8 c9 f' M$ c
       int last = 0;! l5 `' |/ x/ {
       for (int num : nums) {, \8 I- j' G0 Z$ y* {2 h, c
           // (last, num)9 ?4 ^. }- V) p& {8 f0 Y
           if (last == num) {0 [) V0 ~0 L, v
               continue;
9 j( a$ o5 V! L7 U          }8 r0 s2 P. x7 S6 f4 S7 X
           int cnt = Math.min(k, num - last - 1);
* m+ M; n0 I9 U: W$ |. K           k -= cnt;
$ L$ p3 n1 J0 l4 |# k           res += (long) (last + 1 + last + cnt) * cnt / 2;
& a" }+ D( d- T. H2 q) B4 a           last = num;1 H( W) c' ~' y- w" d8 ^, v! H
           if (k == 0) {
. H* H. S+ y* _( V% F               break;9 Z8 ]# I, c9 a4 s  H& Q0 i
          }: L8 G! Z: g0 Y( s7 X6 l
      }
! T1 ^' ^, T: n8 j       if (k > 0) {8 R! Y3 d* J/ c. F6 L: V
           res += (long) (last + 1 + last + k) * k / 2;4 t$ b/ ~3 H" l1 E' K
      }
/ T8 J8 j* W- n2 _4 D8 i- o2 m       return res;( J; V: }9 m0 |8 ]( p- a
  }- Y( M' d% f5 [" o
}
# h* ?" ?5 ~" l- Y. ~5 h2 O5 f1 T2 O6 }& r, n1 K' ]6 R
+ c5 T& Q" R" @9 q" ~, b2 F4 C9 p
【 NO.3 根据描述创建二叉树】4 F' `* ]* q+ I
" }* M; L4 e: s
解题思路
1 S% C8 [3 E3 X$ X9 S使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。% Z5 W# ^! c' Y( p1 x

  M( ?# Y* S1 T% _: r4 k; M代码展示
) j0 H4 K& E# O9 B
+ e0 _4 ]. o* w! Pclass Solution {7 k3 A. s2 P* ^- l2 v# m
   public TreeNode createBinaryTree(int[][] descriptions) {7 W! E. A: [: A4 e- W
       Map<Integer, Integer> parent = new HashMap<>();
' u; F& t6 m4 P* m" w9 N" g       Map<Integer, TreeNode> valueToNode = new HashMap<>();
5 `  t4 G, z6 f$ H5 ^; g       for (var desc : descriptions) {& Y3 p& a9 X/ u
           for (int i = 0; i < 2; i++) {
' ]3 H5 J9 h: j, b5 P7 ~9 M. O               if (!valueToNode.containsKey(desc[i])) {! y" W1 i/ [1 H+ u3 [0 h
                   valueToNode.put(desc[i], new TreeNode(desc[i]));
8 L0 m  L2 a; \3 y$ g7 C3 B& y9 e0 h              }
9 ~- B/ ^6 G4 }' a+ R) I          }& ]. [6 s0 ]! {
           parent.put(desc[1], desc[0]);: e7 F% O/ @/ R$ E4 X( d
           if (desc[2] == 1) {
; G- L- I& d; p( W4 w0 d               valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);/ e+ h2 s6 B2 z  W: ]$ W. p
          } else {
' G, H1 j  C' @  `               valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);
5 o, {9 }7 `% H' T6 ]5 |          }
5 H) F8 v# E6 b9 i' {" k7 ^# H      }, ^6 N7 L3 B$ D/ k
       int cur = descriptions[0][0];
$ r9 a2 p/ b7 a# Z8 O       while (parent.containsKey(cur)) {
$ v5 p! m# |! @" |+ _6 B           cur = parent.get(cur);2 M- U7 c; t. x8 q# }5 R  s3 K
      }7 h- Y/ M0 N+ {8 K, Q
       return valueToNode.get(cur);
3 k7 p' a2 I1 W4 W, E7 G; _; N/ p3 {  }% S- c( X/ L9 N! w0 G# v( g
}& a. j2 B7 s& T( Y- }( S7 V4 Q

+ Z9 ?# [, V; x& y$ F3 [0 ?' _0 ~: ?8 z【 NO.4 替换数组中的非互质数】
) n4 \0 I  ^) b: Z3 a9 Z
# S: Q8 T. j3 M) V& z7 j解题思路
6 Z( B1 [6 u( F正着遍历、反着遍历,直到无法再合并为止。详见注释。0 `2 w. e0 M; z$ `+ G$ Z: i

8 L/ X, G+ \  L% r代码展示  \0 u7 Z0 l4 k4 d) N7 C

6 I! Q. u" _$ L2 \5 H& o3 ^class Solution {
& ^7 h% E& z$ Z; x4 n5 ~   public List<Integer> replaceNonCoprimes(int[] nums) {
$ V2 z' t4 x% @: x; X- ~% ^+ c- I; r       List<Integer> list = new ArrayList<>();
4 F! h7 O2 ~( |; b# B8 T9 h1 c       for (int num : nums) {) o8 J( l  P/ g9 @, N  a: s
           list.add(num);
8 n* M/ b- [+ b! {      }
9 m4 a2 b3 J7 I* [0 z. G8 _1 b       while (true) {7 N2 z5 M* N; _" E4 U) Z
           // 正着遍历,合并一次9 W/ F+ t  T/ t* p8 ~
           List<Integer> merged = merge(list);9 G+ [- I) B' g$ m' Z
           if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
' R5 `0 p- `* j1 [3 T9 U! n6 F               return merged;
/ U+ O# O* i5 v  X          }  r$ l( [3 v3 G- E. R
           // 反着遍历,合并一次* i" l5 @( T" G, {
           list = reverse(merge(reverse(merged)));) |8 e1 w. W. D
      }
$ L$ G1 v) w) v; }) S  q# d  }" d! k! c7 \* z8 B. S7 t8 D2 h2 G

2 }6 T- G5 C/ M' ]   private List<Integer> merge(List<Integer> nums) {
8 a$ X9 Q' k% h3 y/ l* o- }       List<Integer> res = new ArrayList<>();7 m& ?- `  F7 S* F' B
       if (nums.size() == 1) {
- d- r1 J! e* F! o6 ]           res.add(nums.get(0));* _* B6 x8 u2 p6 z9 c0 e5 K
           return res;
% P0 T' B1 A/ s& e8 y- x3 A9 a: U      }
# [+ z* g. S% G) A- u( M" z       // 一次合并中,令 i, j 表示相邻的两个元素) N. T$ {( T  }% n7 R0 ]+ [$ L
       // 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可) N; y, I; z$ p* n6 g! d0 E, L  j
       // 最终将结果 add 到 res 中
( o) y# A5 k$ p5 o% e% Z       for (int i = 0, j = 1; j < nums.size(); j++) {
: \0 p) _8 }, T4 ]# t6 Z2 z- @' t           int g = gcd(nums.get(i), nums.get(j));
5 i1 x$ B% A! C' l6 L           if (g > 1) {
* p  {+ b/ O0 H8 q               nums.set(i, nums.get(i) / g * nums.get(j));
5 ?  w, H. N' Y2 l( \1 L- Y4 N               if (j == nums.size() - 1) {
4 \! H' p. m/ B7 @' e                   res.add(nums.get(i));# M( A: _' U' ?; l$ a3 L. B- d. j
              }
, O! e/ p3 ^) Z          } else {2 J6 ^- L: H1 {* L9 F4 c
               res.add(nums.get(i));
( ~# s9 `* n( u8 p. ^! D; W) I( K               i = j;# p- Y- n/ N3 _4 B6 c1 x0 S4 Z
               if (j == nums.size() - 1) {
2 W. o' Z9 ~* x8 P                   res.add(nums.get(j));
" ^  Y( [  t5 R              }" N& @) Z: [$ R, [! G1 H
          }
) h2 K# N; v: n; L      }
" f! ^! i2 [7 C1 V       return res;8 A2 \6 E, r2 ]8 `6 o. W$ n$ S
  }
1 f: r% E) c4 T7 f. a% M" r* O) w2 y8 k) Y$ [1 z- d
   private List<Integer> reverse(List<Integer> list) {
' e7 U2 @1 a. q% a       List<Integer> rev = new ArrayList<>();9 H- a0 Y# r# [% R2 M
       for (int i = list.size() - 1; i >= 0; i--) {
5 B, ^0 v) K) b( y5 g. c8 U. h           rev.add(list.get(i));
. H& z; F: a! u) n" W      }
& W9 P% z3 p; k5 y- F       return rev;5 ~8 `& A$ T6 t
  }
" v- ~& H) d' R5 I$ `3 p, O9 T9 {& L1 ]4 N/ S. u7 Y
4 M0 f* V  B+ B$ }
   private int gcd(int a, int b) {2 _( \, j8 A7 k5 B0 ?
       return b == 0 ? a : gcd(b, a % b);
- @% y$ Y. _* [4 D9 r! e: p+ }  }0 `$ l7 o; ]7 H  B7 x% W7 E9 v
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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