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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Excel 表中某个范围内的单元格】
# u  K* C# O6 \7 V8 k1 h9 K( _8 J' v8 `  }: w
解题思路) z$ l. u$ V  d1 Y9 l
通过 char 类型的加减法进行坐标转换。
/ p7 h+ c( Q; W" d( @6 l4 a/ N& ~: M" z
代码展示
# y; `; }! S/ f$ q( I3 {1 M! ~5 _5 @3 Y0 i# h$ _
class Solution {) h, S% V1 }6 O/ T1 c; Y5 i$ ?
   public List<String> cellsInRange(String s) {
: ~: b. ?3 M: X6 |       int startX = s.charAt(1) - '1';9 T, J" i, N& x) X9 E( m8 s
       int startY = s.charAt(0) - 'A';
' c- |) E1 A  X# B# U- J4 }       int endX = s.charAt(4) - '1';7 J# P" g5 J' e# e0 J
       int endY = s.charAt(3) - 'A';
8 n8 k" I! y; N  t       List<String> res = new ArrayList<>();
$ e& G2 p1 P3 j6 |& L# c3 \       for (int y = startY; y <= endY; y++) {2 W: Q% F' H! T/ d1 G0 }1 B
           for (int x = startX; x <= endX; x++) {
: h. h9 U3 w$ F7 V) U               res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));) _( v2 Q: a; l* F* @  U
          }
' U7 b8 Y# [* q% ?! S1 A      }
. l5 B! t; |  o& N! I- o- Z" P- x       return res;
+ [7 Z$ @8 f. a3 L& r$ F1 {  }
" x. Y( T9 s  H* a}: q3 Y# x8 r$ u4 Y8 i* `; ]' W

& u; n3 z0 Q8 n
( h; y8 F" A. E% T【 NO.2 向数组中追加 K 个整数】
* q. q, p0 ~( l& N2 Z# n: d; j* A
解题思路6 K7 M; q2 J+ ^# j! f. }! X, d
给原数组排序,然后向有缝隙的位置插入即可。9 o* N4 J0 T: l5 B
3 v/ `6 n+ }9 U% k2 ?- o( T: J/ `
代码展示
9 q0 m1 x' Q$ k; n+ K, u5 O! U" r# ]& b' z: n
class Solution {0 c: l  G% ~) K+ w" N8 v
   public long minimalKSum(int[] nums, int k) {
& Q% c! k( m$ o0 i" o       Arrays.sort(nums);% S' @& \- B  T% p
       long res = 0;1 g# Y7 |$ X/ p1 i$ C+ s% O
       int last = 0;: b3 y4 m, i+ K) O! H8 f5 g
       for (int num : nums) {" @- D. R# R+ ?6 }
           // (last, num)5 W6 ^9 ?0 c* o
           if (last == num) {
0 b1 [, Z; L+ K+ z               continue;6 m% C, s# b4 L- y) R2 |0 c+ C' ~/ p
          }. P4 r0 ?/ j' [" H
           int cnt = Math.min(k, num - last - 1);
; i, b* o2 {, a6 M! h% e           k -= cnt;
* O9 Y  L. W, Q. r8 U& y           res += (long) (last + 1 + last + cnt) * cnt / 2;7 x/ [5 J- x% k
           last = num;' x; c. |. U( J$ S2 C+ m
           if (k == 0) {
2 n1 U) w# q/ g  U4 _( P9 l               break;
: f5 l& Y/ ]; j: E9 f- g          }
' z( U# L" l& W0 s) {4 k      }
7 ?% D# ]8 C5 m( Y       if (k > 0) {5 |; s! R5 g% \3 y
           res += (long) (last + 1 + last + k) * k / 2;# V- r3 q2 u5 a, t9 }  f
      }5 M0 W6 _4 K$ S) l8 o  G( r
       return res;
: Z0 L* A; g" V* D  }6 q, \3 s2 x1 i3 }3 g! W# E
}
( [0 x5 G; _; Q) r2 r  m# }% s5 t. W, o' G5 ^0 j+ b
2 M: C* Y9 g: q( L" O
【 NO.3 根据描述创建二叉树】, A$ o  A( C" o( n' }, n

3 l+ S; j' v6 K2 ?, S5 w. U解题思路4 b/ b1 Y9 X; R  Y7 H! O
使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
6 x4 S( R; j1 e  \" `9 ?2 o0 C$ Q! X
代码展示; [/ b' E, s( }8 w0 O
2 O5 J' `* ^( A- n& E
class Solution {1 W6 x4 F! r" i- {0 N  p+ r% W# N
   public TreeNode createBinaryTree(int[][] descriptions) {
( x7 \/ g/ u% d; C' T       Map<Integer, Integer> parent = new HashMap<>();
0 R9 _8 g4 I" k, a$ P3 w       Map<Integer, TreeNode> valueToNode = new HashMap<>();- ~0 ?( P0 H) \7 T
       for (var desc : descriptions) {3 R" x. e1 d- Z2 z8 f
           for (int i = 0; i < 2; i++) {
" `: R9 \* s3 b  G$ d               if (!valueToNode.containsKey(desc[i])) {; u0 a, D9 S8 Y( [5 f/ t; l
                   valueToNode.put(desc[i], new TreeNode(desc[i]));: F9 T3 Z0 a; w6 Q$ F
              }
% n* F0 N5 w$ O: u* _. l          }
- y2 J/ G- Q! ?1 d7 d* q           parent.put(desc[1], desc[0]);
1 e5 v6 F0 q4 A1 O1 R           if (desc[2] == 1) {
8 J) K9 P. s  A$ Z/ O- }" s               valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);+ T: U5 M7 W* [$ s! a2 P
          } else {; }* M9 f( ]0 w
               valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);1 f9 `5 l) d( s4 k
          }
- `: c- [' O5 o, S      }1 {' l! T- T; `5 `* Z
       int cur = descriptions[0][0];
- e2 F5 R3 B/ \       while (parent.containsKey(cur)) {
% L1 G/ y* c, ]5 `# d- X5 [& C, a6 |           cur = parent.get(cur);
9 P6 r6 q' M% a' B* B- h& b      }- a' Q1 M: {: a- F  `4 b
       return valueToNode.get(cur);  M, n9 X0 U4 M% F
  }
+ `  C: M6 j% |* }}
* ^8 Z4 x$ m' f% K3 G4 A7 q
: V8 f; K' n$ V1 C; D【 NO.4 替换数组中的非互质数】
% n. L, ]' v9 G  e) Y/ ]* }! y6 C3 Y
解题思路
$ w8 k$ y' T4 F" o, ]正着遍历、反着遍历,直到无法再合并为止。详见注释。+ F! P. w( F4 Y4 Y# S

* T% T! J( e5 i3 y: ?0 w7 x7 [' a1 Q代码展示5 n. S, Z0 u% D9 S0 o) e
! E2 f3 S' U/ f1 e# F, f
class Solution {$ \+ v3 ^' Y) V3 z! u+ h( h
   public List<Integer> replaceNonCoprimes(int[] nums) {" E9 ]# _; P( V/ z" Z. g4 C
       List<Integer> list = new ArrayList<>();
) W8 U2 q+ V9 Z+ T1 f       for (int num : nums) {* e" w* {7 p. o. S  k: p
           list.add(num);& v/ i$ b2 Z2 p' N
      }
$ g2 L5 _- q$ P7 v       while (true) {
1 E, \2 o! G! {% d% [' a( a0 E           // 正着遍历,合并一次
7 Y: D6 u6 D+ ^9 ]8 F* |           List<Integer> merged = merge(list);: y! U) _* s9 D
           if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回3 C! h6 j' m3 l/ z- S8 Y( v4 K2 {
               return merged;
) [0 }+ \8 H- F! R/ R" N* d! w          }
# ^8 T) ~; Q1 Y' ?7 U6 e9 o           // 反着遍历,合并一次! j2 W% v, Y6 ~9 \- g( d
           list = reverse(merge(reverse(merged)));& }! r7 k5 c/ c0 z" m6 g
      }/ f0 t$ E8 K* k% e7 Q
  }, C3 W9 n5 B6 z0 a) [4 p! ^

" k6 q+ z+ k  L0 a) Y& Y   private List<Integer> merge(List<Integer> nums) {) f* s! b' V5 R3 }! ^) @
       List<Integer> res = new ArrayList<>();' i$ r9 q$ x  K1 `8 U
       if (nums.size() == 1) {
/ o2 N8 D: z. s1 E- ^, p% h           res.add(nums.get(0));
0 l% {/ [4 K$ X, _           return res;: o3 J9 Q' E; a9 I( x% ^: Q
      }5 C+ z% ~8 U- b! s! ^
       // 一次合并中,令 i, j 表示相邻的两个元素6 }' W; u2 X( W; M/ _) H
       // 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可
! {! [1 F' i6 f, J' B' B& q       // 最终将结果 add 到 res 中5 s8 r( {9 k, [. D9 {6 R2 k
       for (int i = 0, j = 1; j < nums.size(); j++) {
! ]2 f  q* V1 [5 D- P           int g = gcd(nums.get(i), nums.get(j));
" S9 i$ D- c/ I8 v( L           if (g > 1) {
. d9 {# M5 ?* c) l5 g9 e               nums.set(i, nums.get(i) / g * nums.get(j));
+ r8 m0 B  q0 |               if (j == nums.size() - 1) {( e$ b7 R/ p# X; A6 h
                   res.add(nums.get(i));* v3 ?, m& u0 P4 x# k1 k
              }
; Q% D: Y- }9 M$ c3 }  I8 l          } else {/ `, O, E* m: ^  M# A/ R7 i
               res.add(nums.get(i));) `, ~' \* k5 a0 ?% c) i
               i = j;
7 i+ h. Y- d+ F% n" }8 d               if (j == nums.size() - 1) {5 C/ L! ^# d& M
                   res.add(nums.get(j));$ h+ H& u# g& S5 c% o
              }
6 h/ T) X2 e( \$ ^, l) n2 E          }6 y1 m) j! e' ~& S* j" H
      }
& j1 a) ]  @9 ?% q+ R5 D       return res;" P$ W/ _5 K. G0 ?0 ?
  }1 C# X- o0 V. z' R7 b

( P' V! ?# G3 U9 B; K9 v   private List<Integer> reverse(List<Integer> list) {
( L) M8 [- ^/ G       List<Integer> rev = new ArrayList<>();
* q3 N; y) Z" K6 \: ^# o       for (int i = list.size() - 1; i >= 0; i--) {! ?% v5 n1 Z" x1 C6 v2 R8 h
           rev.add(list.get(i));
1 K% Q9 I) \+ U$ S- Q      }8 G; E7 h' g- s, X3 O$ O, z0 r
       return rev;
: ?" y6 C" {) r- g! ?. h7 k1 m  }
; ^  J/ I# W, Q4 w6 [
! r3 J' R. P+ e2 b3 y* c3 a7 j! X4 v# R4 y7 q
   private int gcd(int a, int b) {. ?  i& j8 o& k. G
       return b == 0 ? a : gcd(b, a % b);+ a1 \1 ]! T% V
  }
0 K  x% L) Z0 s: K}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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