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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Excel 表中某个范围内的单元格】
5 [# D: F5 K7 ~( {1 c2 h" ^, E5 c6 ?' R, p* ^3 W0 w
解题思路
& c6 M( c: s# Z% e  w; H- ]通过 char 类型的加减法进行坐标转换。6 q5 ]3 W/ D/ y

% [& e/ u+ [& I1 J7 i- D7 p! ~代码展示2 Z- E& v& F! h: _- @% s

/ a; L: B' V0 @' B2 v: nclass Solution {
& D# w- \- q6 I6 l/ H# X6 a5 O( k   public List<String> cellsInRange(String s) {
* r% {. L$ J/ Z- s       int startX = s.charAt(1) - '1';- Q  e9 f3 m6 `9 j4 L7 k
       int startY = s.charAt(0) - 'A';% N9 M: M  ]9 e& B
       int endX = s.charAt(4) - '1';
% T9 V6 s; B5 I- M! k       int endY = s.charAt(3) - 'A';
/ x* u- o4 e1 O5 ~2 B       List<String> res = new ArrayList<>();
' h' P9 \. s# L       for (int y = startY; y <= endY; y++) {
% Q# I: c4 Q0 a4 U2 m& e           for (int x = startX; x <= endX; x++) {
% t; J  x5 B2 A$ @% o. ]2 k               res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));
1 N- G  ], F9 v$ H8 P! `8 A. S          }
' Z  ?2 p6 @) X! e& I; ^      }" x5 c( U3 O. y7 z7 `5 ~* P# E; h
       return res;
/ w6 ^- z2 M: ?, ~7 W. N4 p( R/ [  }) O( H1 i  O2 }
}
* A, @5 A& K! |, J; m
3 S% t7 u, X6 D" b( I, E( l/ ^. X+ I- D8 Q* n2 E; Z$ M: l1 z! x
【 NO.2 向数组中追加 K 个整数】0 C& U7 z" Y8 u+ ^: f

# |, c6 Q! K/ d2 F解题思路; k+ t+ M% u" R8 W6 p5 {
给原数组排序,然后向有缝隙的位置插入即可。
9 d- D/ {! o# t8 k2 R4 d( l( w+ F" G: W9 Q
代码展示( u5 x0 n; u9 B- ~: h
8 ]7 a' g, h9 U
class Solution {
4 d, \) S( g# f3 U  T   public long minimalKSum(int[] nums, int k) {* t% y# Z# h% Z) k
       Arrays.sort(nums);( P! T' s* g( M4 X, G0 X
       long res = 0;) V' `) m7 I( f1 q$ D- }
       int last = 0;4 w+ |' [% Q7 l! k% k
       for (int num : nums) {+ M2 N# n' C) D4 V8 G: A
           // (last, num)
" w1 s( d* Y8 w+ I           if (last == num) {( P$ j) P) c( I! Q
               continue;* T1 k  E. Z' I* ]2 T# n1 j+ J
          }
: m1 M6 ^4 C% @" }3 O7 R           int cnt = Math.min(k, num - last - 1);
$ C5 L1 P$ v+ Z/ y$ }3 \           k -= cnt;
. c  U9 w6 w- C" s+ `! q           res += (long) (last + 1 + last + cnt) * cnt / 2;' P8 ?6 c/ c: K1 n. g
           last = num;* T! c1 y# y5 A! E' z4 v
           if (k == 0) {
/ G% F- [' ?9 @" F. f4 h4 v               break;
. u  G. P% W1 c1 s, h          }, S* |( d6 H& |3 Y, r
      }' b) ?5 z' ^: ~
       if (k > 0) {1 J8 w) h1 t+ @9 \
           res += (long) (last + 1 + last + k) * k / 2;
, `% W7 {& [0 p0 P2 X, V      }8 [% s  q! a* b- E$ p+ l
       return res;
/ b- k4 l) l6 j3 }7 y4 H1 m3 o, }  }
! A$ Q; e, e, I- s) J5 k5 U) w}
; w2 r( V  `0 b  T: c0 w- E5 R8 o

7 F( o, w; v/ O【 NO.3 根据描述创建二叉树】$ }4 J$ a1 s- d

0 P+ k2 h  n* d9 H# ]" g; K解题思路
& i4 @7 ]9 {& k* k$ V6 w/ L使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
0 v5 N  f( V1 s/ V% V, Y: r' k- Y6 j6 Y
代码展示/ ?) K+ P" ]# u2 L
/ Y+ }  P7 d) k$ b
class Solution {
' O. t; c4 x4 J& @$ Z1 ?   public TreeNode createBinaryTree(int[][] descriptions) {5 x4 W4 i7 h  Q: O0 j
       Map<Integer, Integer> parent = new HashMap<>();
; J: W$ b9 z" `8 t# d       Map<Integer, TreeNode> valueToNode = new HashMap<>();( ~# S6 V5 }& D
       for (var desc : descriptions) {
3 _* s, T' n; i& ]) [- R- _) b% }           for (int i = 0; i < 2; i++) {' Y0 |$ O# M! V! B
               if (!valueToNode.containsKey(desc[i])) {
- c/ C* j  }( w& l6 `                   valueToNode.put(desc[i], new TreeNode(desc[i]));
8 [) [; z$ c0 s0 @: `. H. Y8 w! `              }9 t) O8 S' M$ {
          }3 p0 X* a+ v" N. Y: |7 _: o6 T
           parent.put(desc[1], desc[0]);5 C# [* Q+ R( }3 }2 l
           if (desc[2] == 1) {
! L9 c$ J( H$ U% v, n               valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);  O4 T7 q# B' E" C; V
          } else {
( L. y9 R- r4 \2 N; X- T$ z2 Z               valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);
; x4 E* K) }: e7 u3 \5 C8 M, V- `* @          }
: A, [& M, H7 D5 q      }
' P4 ^# q( m) n. _       int cur = descriptions[0][0];  s& f- B6 r& @% C2 E# U- o
       while (parent.containsKey(cur)) {. M+ `; r, u% m5 a" K
           cur = parent.get(cur);& V3 _# t2 z8 ^
      }- u: l1 \7 J, t/ S4 ]9 Z
       return valueToNode.get(cur);. n( \" D  J+ C8 q$ {$ W9 _
  }8 m% I8 l) E. s% N
}
8 I4 s: \: x  [9 N0 \  G. J6 q' a' I8 G0 k/ y
【 NO.4 替换数组中的非互质数】
+ |! S/ R; @# x$ v5 @2 ~
0 `7 D3 Q0 u" V9 r$ F4 J解题思路
" B& s4 }, m. E& X/ d正着遍历、反着遍历,直到无法再合并为止。详见注释。
% R3 N* e' E# `% C* o/ Q6 I  Z
* Q3 y9 D4 ]9 @- y( J* t代码展示
0 M" _; j1 j5 R  N; X$ S+ R+ D3 U7 K( g8 d0 e
class Solution {
2 _' q" D. B$ }; U) d5 N- D   public List<Integer> replaceNonCoprimes(int[] nums) {. E' T( {# [! k) j& e% h4 N
       List<Integer> list = new ArrayList<>();
; A7 Z' F( i  V       for (int num : nums) {
( p; ~$ y3 a% X- {$ v$ X3 E           list.add(num);7 S- N% }1 I" p  @/ x7 a6 T
      }
+ K- e' v1 _4 g, _9 f1 A. \       while (true) {
9 A# ~/ ?% q1 A( f" ^% _" [0 L0 {           // 正着遍历,合并一次+ l: K  V. b$ v* L
           List<Integer> merged = merge(list);- W% }5 r$ \* e
           if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回8 K. \0 g8 E6 ^: Z7 B$ D: r: ^
               return merged;7 ~8 r/ X' G: H. S( P1 ?9 |/ y
          }
' k; X; Q+ P; j; N% n1 B           // 反着遍历,合并一次
( ?4 D* w9 m9 s/ z( ]           list = reverse(merge(reverse(merged)));; j  J0 X( k9 ^6 q; z
      }
1 b( p; q$ Z0 |  }
6 k  |- j& J7 S; t/ H# \; e& P- x! {/ F# h9 g. g
   private List<Integer> merge(List<Integer> nums) {
) i/ B- \$ N# e4 d       List<Integer> res = new ArrayList<>();
( f$ Y) ~% z, T" `( h$ A7 l       if (nums.size() == 1) {
% X! N1 A* l1 i3 T8 M' _" v           res.add(nums.get(0));
, ]3 \- B2 g/ v8 ^- c4 K! \           return res;$ }5 z0 E% o% _8 P
      }4 v  W( n4 j: ?- P3 ]7 M
       // 一次合并中,令 i, j 表示相邻的两个元素0 t/ D; x3 P8 r1 O
       // 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可- c: A7 R- {- w) i- q
       // 最终将结果 add 到 res 中# A2 K5 g" O% v
       for (int i = 0, j = 1; j < nums.size(); j++) {
. n, y9 k+ y0 P8 q3 \  i. Y* W& R           int g = gcd(nums.get(i), nums.get(j));5 z7 x7 E9 W( z* Z
           if (g > 1) {( x: s0 r( s9 j" Q$ U
               nums.set(i, nums.get(i) / g * nums.get(j));; {6 d9 y% T! o  Y* k2 Q6 m' g# y! m' Q
               if (j == nums.size() - 1) {5 |: J) `; N, a$ B! }1 F
                   res.add(nums.get(i));
; m) T) k5 ~; K3 c  G+ r( }$ Y              }
- H6 [  K8 r1 k4 Y1 i! p          } else {
  ?% f) v3 T+ d' ]               res.add(nums.get(i));! ~" H& A4 u6 Q4 b0 D/ n, I4 q( [* y
               i = j;9 Y7 z8 I6 N* [5 k: b/ y* q
               if (j == nums.size() - 1) {
# @% e- e6 O8 O2 }2 f; F* O                   res.add(nums.get(j));
# N0 Q+ \% t- `! K9 L              }
# T7 G; r% x* ^# ]          }6 D  B6 p5 A. D' K% s2 F
      }! q% l9 P) ~' b9 q/ _: X
       return res;, q% z& B7 Y% E9 `: l6 _5 r
  }
! _5 Z, G8 ~) J* ~/ c: O" n, x& y7 H8 \6 w3 v" Z
   private List<Integer> reverse(List<Integer> list) {5 i" {9 V2 ^5 W, Q4 V
       List<Integer> rev = new ArrayList<>();
" V0 k% }( T- J/ B& j# Y       for (int i = list.size() - 1; i >= 0; i--) {  Z: ?' N* ?+ P) @% u$ |3 [
           rev.add(list.get(i));' `& d4 e  }, \" s. d- c9 a8 @) d) p
      }. |0 B, g+ [6 ], K2 |% g; w' O
       return rev;
" r6 e, y: \! x. D% {! Y* Z  }
. ~( p9 M" t: X; Q  |6 r. [$ \  N) i' j
6 B# v! q$ O& B0 |+ P' \* G
   private int gcd(int a, int b) {
; n7 B* X# K, T2 {4 P. q       return b == 0 ? a : gcd(b, a % b);
- b: }1 W/ `6 D  o2 d- N  }! W$ u6 P# F" |2 h' r
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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