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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Excel 表中某个范围内的单元格】
  x! d; b1 n3 E
' o# {1 o$ H0 Y7 z, a解题思路9 |7 s# M+ o5 E) v. ~
通过 char 类型的加减法进行坐标转换。
+ m& e! ~4 h' o4 C0 L# W( K, K% \: \7 ?! ^5 h
代码展示
, ^2 O8 \- m' J+ X) `, D5 q) x( L$ J) S2 A! r5 L
class Solution {/ I/ i0 f2 x: \% `* h7 P7 z
   public List<String> cellsInRange(String s) {& C2 Q, O, M) V: ~1 O& I. Q
       int startX = s.charAt(1) - '1';5 S, H, Z# J9 ^! v; d( N1 |: }
       int startY = s.charAt(0) - 'A';
5 ^2 Z* ]. E: y6 o& ]       int endX = s.charAt(4) - '1';* {: O& }! I1 x  \0 `! m5 o( i
       int endY = s.charAt(3) - 'A';1 L  B# y$ I0 x6 }/ Z% C$ l2 P2 O
       List<String> res = new ArrayList<>();
1 @1 u+ f/ j* R       for (int y = startY; y <= endY; y++) {- z4 I* [0 O+ R8 S7 E
           for (int x = startX; x <= endX; x++) {
% c4 I7 U: D2 i) X1 S  p* \               res.add(String.valueOf(new char[]{(char) (y + 'A'), (char) (x + '1')}));5 E: P2 R; Q' q9 c% L
          }
: Z. w% D; {% a) C" }      }
: [! {$ R0 U4 w& j1 a5 u; f0 S       return res;
! k# K3 r- n* [& W( D8 c  }
. o" F' i8 ]( Z% M& k8 J* u8 I}7 H0 q1 X9 o5 `9 Z

+ h! `: a! ~8 m, r( _% R8 P! \$ c# @. y: m9 ~, O6 i
【 NO.2 向数组中追加 K 个整数】% v2 ^, f8 L/ t% C1 S' E/ f

7 t' v) R0 G+ L5 j' B  }解题思路# ^2 |  X+ t5 C! F2 i' T
给原数组排序,然后向有缝隙的位置插入即可。; ^4 Z' ~% x( ^

' o* C# V* w3 F6 Y代码展示
! }. Q- S! M) a* e. z8 j( a) t1 U- C  n# L6 |
class Solution {
  _  ^, P* N9 G+ Y2 p. p   public long minimalKSum(int[] nums, int k) {! J5 z+ M+ t# R
       Arrays.sort(nums);1 G* c% z7 L8 N# l' Q9 T- ?
       long res = 0;
$ B. l6 U3 ]5 g" J( O       int last = 0;
8 W' \$ R9 P+ p4 o( C       for (int num : nums) {; ?$ }* R8 m& ]1 T# U% o1 @$ k
           // (last, num)% T/ C- a4 g/ ^$ j& ?
           if (last == num) {, X8 _1 K4 ]. O" g5 V
               continue;
% t9 v! U- V, S: |# s8 _3 |: f# }- P          }: ^- S! F- m2 A* ?5 r) W
           int cnt = Math.min(k, num - last - 1);. I9 S9 ?* r; M, y' Y3 T" W8 D) Q
           k -= cnt;
5 t( v9 I7 A6 o5 W) g0 p           res += (long) (last + 1 + last + cnt) * cnt / 2;1 y' O. Z# Z8 o( M! C/ I3 z/ g9 z
           last = num;
  g' p, e6 S1 X1 C           if (k == 0) {
' \0 b7 C# k7 D: S; w: D6 q) r( z               break;; w- O8 U% u+ F: ?
          }
7 z  }' _' T, m      }
- E& d; H; Z7 h' G7 h       if (k > 0) {
/ O" I- M6 R2 N4 k& Q' P           res += (long) (last + 1 + last + k) * k / 2;2 b( w6 C, L7 x
      }
$ P. [- w6 w2 X* Y3 v       return res;( S: d( Y" U( f5 [+ ]
  }
) W7 b- U; J2 x+ U$ I" G}
( L( u6 B6 U+ V$ O: R# J9 |. ?) _. u& Q1 J+ ]

6 ^: k- S4 Q4 U$ ]6 ]【 NO.3 根据描述创建二叉树】$ ], Q: ^0 n1 C+ i9 r

7 N# N: l# P7 |9 N" v& x% W解题思路
$ i! v2 n0 w" V. S$ Q$ J使用两个 Map, 一个记录节点值到节点的映射,一个记录节点到父节点的映射。
. Q: H, M8 ]3 J( D
9 }9 P3 p* t- a4 V  E代码展示  A# ^1 d3 m8 u  V3 f6 s0 b
. u( z9 P, O% g$ N) ]1 `
class Solution {
2 }+ w* O$ Z& S   public TreeNode createBinaryTree(int[][] descriptions) {
8 J% P2 z4 b) u* M       Map<Integer, Integer> parent = new HashMap<>();
4 Z* o) r+ d- F       Map<Integer, TreeNode> valueToNode = new HashMap<>();& h: v  N& H0 X
       for (var desc : descriptions) {
3 _8 f3 t3 ]& E           for (int i = 0; i < 2; i++) {, ^8 ^9 P3 x9 W; B! O
               if (!valueToNode.containsKey(desc[i])) {
5 I3 M2 b5 }$ I+ c" }% k                   valueToNode.put(desc[i], new TreeNode(desc[i]));3 k( ~7 [1 t0 j4 U1 Y
              }# m; F: I5 |+ \: F2 h' ~3 g
          }9 Y" J- i7 C9 m- k: T& J* x* F) }
           parent.put(desc[1], desc[0]);
4 [  I5 t% b  y  ^7 [7 l           if (desc[2] == 1) {& p9 g( N4 E) h) U/ o& Q6 q1 S
               valueToNode.get(desc[0]).left = valueToNode.get(desc[1]);
& u- P' E/ k% f' [7 c/ k0 Q2 S; D          } else {* ?7 I; K5 S1 {+ @1 a
               valueToNode.get(desc[0]).right = valueToNode.get(desc[1]);8 b3 ~$ T- p' R' i: P+ R
          }
1 I* @' _1 m+ Q$ d. i+ D# ~& \      }- t, M  @, i' ]7 P! O
       int cur = descriptions[0][0];/ V2 G# t' ^" ?. B! A6 e
       while (parent.containsKey(cur)) {; y' K, n" u7 C  }0 V
           cur = parent.get(cur);5 v' K% z3 ?; g* D3 A) P
      }, q( e% ~3 V0 w3 x7 H+ ~& K
       return valueToNode.get(cur);
4 C; ~* Z) k  f1 z9 y1 P  }
- @. D8 d8 {  Q3 g6 L% @}1 y3 E0 Z0 a( h
/ T6 F& l6 @$ g
【 NO.4 替换数组中的非互质数】* B( G8 U! v1 r7 p/ l
, F# o3 a4 e' Y% }, }) q
解题思路0 P' h3 {& p- T0 S9 A; |
正着遍历、反着遍历,直到无法再合并为止。详见注释。
* O" T( k* {: [9 b
7 n- H# n+ v( }( H2 K代码展示
; Y) d% G, F" L; X) z# t
! v0 N7 e5 X; Lclass Solution {' X" i* r8 {! v
   public List<Integer> replaceNonCoprimes(int[] nums) {+ H# h. k3 r. M# X& F! C
       List<Integer> list = new ArrayList<>();
9 x& N1 v9 R. V. D9 A       for (int num : nums) {
7 |- P" O' }1 k; k% F  R  X           list.add(num);
9 a; c! A0 i, j9 \5 ?: c      }
, G1 G/ [8 x1 b# ?       while (true) {
& s5 B8 w3 \- c$ I3 s2 R$ N4 P           // 正着遍历,合并一次& ^6 M& O- H% v- Q; _3 @, s2 ?4 o! C) L
           List<Integer> merged = merge(list);. |  |# d/ l* J5 G) {
           if (list.size() == merged.size()) { // 合并前后长度一致,说明无法再合并,直接返回
+ _, I1 L  M( X               return merged;
) T$ N  I7 T4 E6 {7 E9 G          }
! t9 Q: I# K# |           // 反着遍历,合并一次* T2 T+ E# P( Y/ Q5 ~) v& l) u" c
           list = reverse(merge(reverse(merged)));' B7 h5 g/ s! U2 B4 h& p
      }/ u* Q& B& \, O1 V9 F) g; z
  }
$ `1 \0 Q& f7 H! R
6 E3 H) a! U) y$ S3 g   private List<Integer> merge(List<Integer> nums) {
2 }7 Q' Z+ G, O0 Y" l       List<Integer> res = new ArrayList<>();6 |7 g' w& R2 g' Q
       if (nums.size() == 1) {
2 B6 Y* B! r( d2 ^# @           res.add(nums.get(0));
& m3 h  n1 O0 _2 W0 \           return res;+ j4 l3 j5 i# T3 H$ R- {
      }
; l. e4 ^9 U4 q       // 一次合并中,令 i, j 表示相邻的两个元素; `: x7 W  `' u& z0 p1 b1 \0 h- x
       // 当 nums[i], nums[j] 可合并时,nums[i] = lcm, j++ 即可* p0 j- J% p# B' s* E+ ?1 P
       // 最终将结果 add 到 res 中( T0 Y/ r& u. V; v, q
       for (int i = 0, j = 1; j < nums.size(); j++) {0 h* ?# X$ w% {& B" X. t1 A, L. A
           int g = gcd(nums.get(i), nums.get(j));
. G! P0 e9 h4 H           if (g > 1) {
: e- u# [& T& R, F. h               nums.set(i, nums.get(i) / g * nums.get(j));
. O. S. K+ X0 z0 h3 E# G               if (j == nums.size() - 1) {
+ x8 f: k+ Q3 n                   res.add(nums.get(i));
% T; U- H" H5 C" u: D1 ^4 p& k& a              }) n3 m. @- T* h0 e) J6 k+ ]0 j
          } else {: y7 f6 h5 P3 R# p: e& N4 o
               res.add(nums.get(i));
; K- {! z* z1 y7 n/ O               i = j;: w1 z5 n  ^! u# G& ]0 |% n
               if (j == nums.size() - 1) {
3 a3 c9 [* s6 Z( w, \& `3 {& L                   res.add(nums.get(j));: z( x( J/ g; q. v& d  ]/ d  H
              }
6 S, M* L3 [# @: X9 W5 L          }
/ ~7 v) c; u9 I      }
4 T% T) ^4 g3 Z( d( @% ^) Z. L4 ^' A       return res;
0 _2 B) V' M; z+ z  }
3 W: A! X) v/ d' L
& N: c% D5 @) Y   private List<Integer> reverse(List<Integer> list) {( N$ s% {$ z/ L, X9 @2 C2 \
       List<Integer> rev = new ArrayList<>();
+ O  k3 U8 S  W( u( J# q       for (int i = list.size() - 1; i >= 0; i--) {
. k& q9 E* a5 t: w2 S) @) X           rev.add(list.get(i));' @2 k1 S1 P4 X8 t# R
      }
) S8 H& p, A* D+ H' W       return rev;. M: U5 C9 C  d7 e" a$ ~
  }0 D- ~9 S# v' ]
, [4 L+ I  J3 m! J5 i
: S& z% B5 G9 j, b3 N: \2 B
   private int gcd(int a, int b) {, R* |0 E- V# U) T
       return b == 0 ? a : gcd(b, a % b);
! Y9 D" V4 M1 T+ f4 [' G6 G5 P. ~  }- V" Z9 A" d/ G- i, g
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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