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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Excel 表中某个范围内的单元格】8 c( _. O" ]6 I/ n# B$ f
& o8 \8 s1 p% ?7 w8 l4 @% j( s$ v- G
解题思路
2 \3 Z5 W& m7 F2 z0 z4 _通过 char 类型的加减法进行坐标转换。
* [; e$ [& l# [, W
: X, P  N6 r3 t. F, f1 |代码展示3 R# W9 I) y4 ^% m9 u- u
( k" X. v* m' c# J$ L+ K" a
class Solution {  F  E' ~. h6 ~: y! {/ E
   public List<String> cellsInRange(String s) {
  y; \& z/ w7 y       int startX = s.charAt(1) - '1';
$ x* T- v2 Y' X3 j# B& q( f* t2 T( a       int startY = s.charAt(0) - 'A';
0 I4 V8 Y% x+ w2 R0 Q( s       int endX = s.charAt(4) - '1';, ?0 g6 S* l& k# N, V
       int endY = s.charAt(3) - 'A';
( L$ }+ `3 R! l1 Z       List<String> res = new ArrayList<>();0 J/ B4 B) W6 ]- h  u
       for (int y = startY; y <= endY; y++) {: |  I+ o. u: ?6 O6 E
           for (int x = startX; x <= endX; x++) {
- _/ y4 a0 J& T' a! r' q               res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));, l" |) k3 H$ B- C" B* O$ ^
          }6 ~% v# z( X: Z3 l: i6 q
      }7 L7 Q) i% Q# X% I. C5 b2 x( W
       return res;
1 S$ u5 B$ F% q  }
1 Q2 G+ O- b& }" G1 t/ i}- K. I2 s: I; a) @

" [* m& i( g6 B0 L+ p% t+ b& D
$ F- P4 u% c+ r' |2 t) V. w【 NO.2 向数组中追加 K 个整数】
* n  i. j: h; i' e9 ]+ l
3 J& m1 c9 M! [& s8 _& Z解题思路/ w8 b" A2 l3 Z4 C; j
给原数组排序,然后向有缝隙的位置插入即可。
- Y; Y9 r% ^8 D( T2 x& K4 ~6 m9 A/ Y& W0 B1 b! B
代码展示
3 E; G: l: y8 h9 a' K+ O) K
" f% j% O4 W, q5 |$ Cclass Solution {5 w0 n$ r) s9 e: Q) X& }
   public long minimalKSum(int[] nums, int k) {
- J$ N% D: [: u       Arrays.sort(nums);0 B. q8 N3 ~( ]! Q& D$ p3 x
       long res = 0;$ c( p0 o. p- K4 N# @9 P# w6 {+ s
       int last = 0;
% X. X. m* A: h  G8 N! P* v       for (int num : nums) {
$ S( @9 j& @6 z( k+ a% q           // (last, num)# r) Z% Q4 o" ]
           if (last == num) {, [) d' S3 j* `9 g, N/ U
               continue;0 q+ Y, G8 A6 l' d/ @! v
          }$ o  m6 s% Z/ B% `: r+ a* u
           int cnt = Math.min(k, num - last - 1);
8 P: a7 f: d% {! t9 W1 Y2 C           k -= cnt;0 l# \% u2 Q& k  w# y: N4 {
           res += (long) (last + 1 + last + cnt) * cnt / 2;% l4 n9 v+ B4 H6 g2 o3 |/ ]
           last = num;# @8 E- U8 ?1 z' V& K9 k
           if (k == 0) {
. i( s0 V! y3 X               break;
& o' K2 @$ q- I; d          }
$ p# c# ?4 Q3 U' A      }3 G: J: H4 W- |1 m- c! r
       if (k > 0) {
# H4 [; t/ B9 Z  M5 T. B           res += (long) (last + 1 + last + k) * k / 2;
7 ?, F8 Y( a7 W      }
' Q6 P2 y' a' m% Q       return res;8 M: }4 {: Z& Z) o8 s% D  F
  }
/ B4 {  Q& e! p% a  B- y}) z# r3 J1 L, }& I1 s$ @

4 V% Q7 \6 s) z) {' Q% d
6 E9 @1 c" P7 I9 P# F+ Z( z  c【 NO.3 根据描述创建二叉树】. H$ s& j" g7 {; q
) Z" X& s+ [( R- Q# H+ D- k4 [
解题思路
# ^& d& ^' G8 v使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。2 @, v0 f3 S7 F: I0 e/ j2 i
' c0 X7 B4 W) \; I. {0 \# B3 |$ L
代码展示2 t9 ^8 |3 p2 R& ]

7 `1 |, ~# [. Cclass Solution {
1 _8 ~; x6 o$ b' E8 }8 W. g: H   public TreeNode createBinaryTree(int[][] descriptions) {  b" C: F6 l' c
       Map<Integer, Integer> parent = new HashMap<>();* i5 g0 p; t3 n' Z. f
       Map<Integer, TreeNode> valueToNode = new HashMap<>();
3 i5 {+ B7 A9 s+ E5 N, i2 h       for (var desc : descriptions) {+ A9 l% C) a# {  L4 P
           for (int i = 0; i < 2; i++) {
" p. r5 W/ n- n7 A. q               if (!valueToNode.containsKey(desc[i])) {
; [. A4 h0 W/ c$ B/ t                   valueToNode.put(desc[i], new TreeNode(desc[i]));, p0 H9 V" H2 @/ R' c
              }
9 Z- i, P8 h3 S! g) r( M          }
& q' o9 X! N" h( B3 J- x1 t           parent.put(desc[1], desc[0]);
3 z, J/ _& a5 h& ?8 Y           if (desc[2] == 1) {+ ~% P3 P) x) q) p3 e
               valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);
$ t: A1 `" Q) c* g( H8 |+ a$ u          } else {0 n' `" X8 k. G4 ]# a
               valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);
' Y: n$ L- O: j8 L3 V0 I1 B! ^' Q          }
8 J+ A& L+ A' W6 g/ T* [8 D      }( X* _2 Q7 x$ A; q) L
       int cur = descriptions[0][0];$ g( b  `8 H8 [+ N1 _- W8 j, B
       while (parent.containsKey(cur)) {# E. B: j0 B0 ~9 T: h$ H9 ?3 V5 ^
           cur = parent.get(cur);* W8 ~  A; Q) v
      }
% @0 k' ~8 M* y* [       return valueToNode.get(cur);
+ W( z; d: G) |5 N/ g  }: W: L0 h4 j, g9 v" v  C) V
}) c7 L  \# ~2 ?' t( C. s

% q! Q% T: h0 D: E* B4 @& O【 NO.4 替换数组中的非互质数】0 B' l3 s+ w. w- w3 k" }
# _: K, Q8 X- w8 k8 j1 ~. N2 {
解题思路
, s' V8 U" X; J" Y5 I" j$ B正着遍历、反着遍历,直到无法再合并为止。详见注释。
& l8 t8 U$ d3 V: E/ `; K4 V/ R
+ o6 k) D8 \0 I代码展示
1 P5 F6 J  [2 h5 h' r4 \1 M5 p2 f# `  g( P! o9 A! T6 L
class Solution {& @3 Q3 \  N/ Q1 }7 L- Q& x) u
   public List<Integer> replaceNonCoprimes(int[] nums) {$ P1 Q, g7 P7 F& Z5 a7 e  ~9 p
       List<Integer> list = new ArrayList<>();: Y. N7 `9 w. u2 Z& n$ Z0 V& N
       for (int num : nums) {
5 v0 {2 \, J2 o! z% _           list.add(num);
3 A& w3 E. P  w      }; m9 f$ c3 b1 `( o4 L
       while (true) {
) x1 c7 B# \$ N  S. L3 H6 o           // 正着遍历,合并一次% o  o& G( D1 d% H$ d8 Q  V
           List<Integer> merged = merge(list);
+ t- H6 W  K2 r$ v* H           if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
0 |! v, J% l( f8 K6 s               return merged;6 z) K+ a$ }' {6 a' l4 Q/ z3 i% g) @
          }- c- S2 t* o# R: ]9 h5 {5 H
           // 反着遍历,合并一次
# E$ ?. E8 E) n5 U) w( a. u* D           list = reverse(merge(reverse(merged)));
" Z& J. w% L; i! [; d2 T      }! h+ n. U1 l- r) V& s$ [1 ]  P- r
  }6 L5 P* H$ m. Y; @/ Y

9 @# R/ Y' s4 z3 Q% q; W& K- R   private List<Integer> merge(List<Integer> nums) {- ]' ?8 l1 E7 P1 f# P% `  c
       List<Integer> res = new ArrayList<>();  {, S5 H# I& g5 W1 |' L% I
       if (nums.size() == 1) {
5 U8 ]3 ^" P3 m           res.add(nums.get(0));+ A. q& S" V: R3 V; M( F1 [4 s
           return res;
0 ]# [+ @, {& @      }/ z% y; y* p! v) k/ t
       // 一次合并中,令 i, j 表示相邻的两个元素! p# ~. m, e$ M. A( d
       // 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可. G& t3 U- ?$ Z, U) u' \: L! |
       // 最终将结果 add 到 res 中
& \1 j; ~  E- B) ?, J       for (int i = 0, j = 1; j < nums.size(); j++) {
2 e9 _7 o( d1 U2 R* q           int g = gcd(nums.get(i), nums.get(j));
5 s, G: ?9 c' S1 Q3 J           if (g > 1) {
$ @- q% C- y( u  z               nums.set(i, nums.get(i) / g * nums.get(j));. I- i9 t+ m1 N
               if (j == nums.size() - 1) {- u3 X; \; k9 W1 K; h% V2 |* s
                   res.add(nums.get(i));
$ u2 c6 A4 f' J; M              }
+ J, r2 d: V% J& O* G          } else {
: I- o+ q* o- f4 n$ ?               res.add(nums.get(i));
  |! u) ^, E- n& y1 Y               i = j;" u/ V: }' u: U7 L& }& M* @
               if (j == nums.size() - 1) {8 I7 V9 s! t) V( w
                   res.add(nums.get(j));; I0 U! j" m' P! m4 r. N4 D8 }/ u
              }% {; W4 U8 c+ a5 {
          }( o) F. y4 u/ z7 b) v4 H
      }
) f- ^1 ]& o) K* p. O! F- b! j/ J" z       return res;
4 m9 O3 |! B+ C2 G" g  }4 B1 z: p1 H8 f5 D# Q5 G

/ c) F2 ]* G5 v5 S0 Z7 q/ |8 u   private List<Integer> reverse(List<Integer> list) {
) T: t& v6 [" d9 V% p       List<Integer> rev = new ArrayList<>();8 }+ W& F& A' v) O4 K5 d
       for (int i = list.size() - 1; i >= 0; i--) {
  O# u, B& K: T" B9 A: b; ?           rev.add(list.get(i));
$ i% T. `1 _3 N4 R      }& J+ w- C8 `" i1 k4 x  Z. b( f. ]
       return rev;% u) ]: ]" g3 f7 ?8 d+ Q+ p/ j" T
  }
! [8 B% z2 y7 h/ ~7 g
" f; k3 \! d7 E% D8 x5 a6 j1 g- p" _$ |2 m; U; p; f: M
   private int gcd(int a, int b) {
) `) ]4 l) ]4 c2 T       return b == 0 ? a : gcd(b, a % b);4 L, Y9 `% J: T1 K
  }( n; |6 O( q+ N
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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