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

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

上岸算法 回复:0 | 查看:2253 | 发表于 2022-3-27 16:58:22 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出两数组的不同】
' r# N0 a( F& D5 K6 V
& N4 p5 r# x0 s( H  o0 }: M6 o解题思路
' l# t3 W: D8 a; ]9 l可以使用 sort + binary search 求差集。
7 _6 q& D# `4 c# {) \, h
5 `( S+ z( E2 }& d# W代码展示+ R! Y: P; t) n  k8 i

" k1 B% \, I0 z' wclass Solution {
: z0 R5 k; Q$ [+ g9 d+ z   public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {5 w+ ~3 k5 c7 F* Y1 U! V1 F% [
       Arrays.sort(nums1);# T: W5 b2 G3 Z- N- X
       Arrays.sort(nums2);
, X% [: e7 n7 X% a7 b       List<Integer> res0 = Arrays.stream(nums1).+ k: e9 `3 m) q: f4 g7 u2 R
               filter(i -> Arrays.binarySearch(nums2, i) < 0).& v- {; u6 D6 l* I% l1 t' W7 ]
               distinct().boxed().collect(Collectors.toList());
5 a  V  P, B' x& G       List<Integer> res1 = Arrays.stream(nums2).
' D6 M7 `3 W8 O+ F/ _9 A) M4 I5 r               filter(i -> Arrays.binarySearch(nums1, i) < 0).$ r- t6 m9 H( b0 I
               distinct().boxed().collect(Collectors.toList());
' ~5 }% a/ H1 e$ [0 {9 q       return List.of(res0, res1);
) n+ F/ L7 T/ ^  }6 w+ t6 R3 w( f) Q; W
}" @9 R% s6 M. O

' o. Q' W* ]6 N2 @
2 v$ d2 O/ Q$ ?! Z0 m, K【 NO.2 美化数组的最少删除数】8 m( I/ X2 R/ z; k( ?+ O" V$ T

4 y0 Y1 |& L& i2 N4 B解题思路9 l' _. ~9 `2 v. Q9 X1 X  k
从左到右遍历即可。1 w( A8 G/ _6 [: R; a

% X9 b$ H9 `$ x3 @代码展示5 b9 Y* M: N9 U3 p/ A
0 p+ T- M, K7 ?7 _
class Solution {8 h4 y! v/ v: F
   public int minDeletion(int[] nums) {% _. {7 {2 e4 i3 \, H
       int res = 0;9 W% @: n8 y) b+ _
       for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同1 P) E* A5 ]5 @
           if (i == nums.length - 1) {     // i 是最后一个,应当删除
9 W" G9 }7 n1 `+ ~' N               res++;
! l6 A4 n; m( u  f               break;
2 r6 S+ e1 Y  K/ t3 u          }
& T) J' ^" o" a; l- H$ g5 d: d$ q, t           if (nums[i] == nums[i + 1]) {   // i 和 i + 1 相同,应当删除,相当于 i++
7 D: m- l! M3 y( {# F. M. I               i++;( Y. N$ ?7 z% S0 a  l% V
               res++;( i7 \9 T# R* D
          } else {                        // i 和 i + 1 不同,可以保留,i += 2 以判断下一组2 I/ D8 ~/ b  k( a7 C1 k
               i += 2;9 u0 K1 z& G0 ?& S; I- ^# [1 Q
          }
4 P* v0 V% ~" w      }3 r6 C4 M" X# ~+ U' k
       return res;, |- b' V+ X- p! H
  }- \5 n; q( u4 W
}
& n& S: I, Z5 `1 f7 T0 ]8 s( w5 z( f, F  C) W
6 S2 Z) T% H" @. ^+ L0 P
【 NO.3 找到指定长度的回文数】
4 E6 t8 y4 W% T$ L
! w7 ?2 ]  g9 _! s) Q' b# o解题思路
$ G% n. s/ O- U: v  K举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。( y& @6 g7 I- L
( z1 U/ o+ y4 q8 O+ B1 P2 v8 f
奇数长度的回文数在复制出后半边前去掉末尾数即可。
& z/ _' F) [, |* u. [" c. ~. U4 \$ I
代码展示
9 I1 _3 ^0 T, ]2 o- n3 {2 o! P8 o9 \7 P6 I+ [
class Solution {- [4 i0 [% @: L8 v3 p  b
   public long[] kthPalindrome(int[] queries, int intLength) {6 E  A4 d; H  M' x% q6 W0 {! ?
       long[] res = new long[queries.length];8 ^# |4 z/ }: z/ _. W8 A, f: b
       for (int i = 0; i < queries.length; i++) {
9 O* ^. z- X" w. C& v8 z           res[i] = kthPalindrome(intLength, queries[i]);
  b. d  F. C5 r4 |% j      }
* [" f( t, Q) R9 J! a       return res;
6 r1 J/ j; W5 I. L- `  }' s  Z6 {# B4 s

4 A- o8 t+ P/ E' t' q   // 返回长度为 intLength 的第 k 小的回文数
0 m1 l1 V) t7 l9 }+ I/ o- s3 m   private long kthPalindrome(int intLength, int k) {: T( K4 ?/ g( T* Z+ a
       // 处理偶数
2 y% T5 v, h; \" W% t: i, p  D       if (intLength % 2 == 0) {
3 b% B! W( d& B$ F7 Y: u1 g# i           long half = pow10(intLength / 2 - 1) + k - 1;
0 E! U2 W7 ]5 K$ ~5 p% F  Q1 r           if (length(half) * 2 > intLength) {5 d; R+ J1 h* U! W" |
               return -1;
& Q# j& {+ H  F6 n6 u          }
& o2 K" c8 v4 a           long res = half;
' ^. q! Z) ^9 v9 h2 B" h" l5 F           while (half > 0) {: B7 N8 E1 L+ u5 `* `  e
               res = res * 10 + (half % 10);
! T* G4 K  k! B! @               half /= 10;
2 V: P; J* ?- Q1 q) d" g          }
' T: R( s, L  Q/ k           return res;" M6 w" o4 X- ~3 I% m
      }5 g0 @/ f' U. D' N& ^' v- {; V7 ^, D" v
( F( t2 D! R! U, h4 @4 A  L
       if (intLength == 1) {
) ^6 u, y/ L$ {1 I           return k > 9 ? -1 : k;
6 H$ ^4 ^5 N5 }6 y8 a      }' Q) r- Q: w+ r% R

) y" r. P4 D; Q% o& D7 e       // 处理奇数
7 h5 S/ A( d8 c1 k  `       long half = pow10(intLength / 2) + k - 1;
, o" D9 w# w! s5 Z4 c3 \5 M) S       if (length(half) * 2 - 1 > intLength) {( L: S, r. M, l/ {
           return -1;
! K0 Q2 N$ ~/ T& W; F( H      }
6 X$ E7 R  x" H8 s( a. M       long res = half;4 w, a# k, Y7 x; w- j
       half /= 10; // 去掉末尾数$ ^( [9 z8 v; r
       while (half > 0) {, w' O' @0 A7 }- [! V7 I
           res = res * 10 + (half % 10);. B: L6 w* n/ F) J% G  ?- e
           half /= 10;, K& b1 k, X: M% t
      }
( S3 I3 S  ]3 B* n9 S+ J! D) y       return res;$ L% f$ X- e5 G( l. L
  }$ a% p5 s1 d& a( k0 I1 Q

4 m+ H; @, C% i) {   private int length(long n) {
, ]4 l$ D. o$ j8 e  r; s       int res = 0;9 n% p* L. _& P1 z
       while (n > 0) {
9 h" T8 e. A' e% @           n /= 10;
3 k- P4 m8 s( N0 Q; b           res++;
, r5 ]# v- H4 b) T, V) f      }
8 V- M& r/ I+ c0 F5 F       return res;
( T  g' s: b: ~( U  }
" `* ~) n( }, v, `8 M2 y7 ^/ R
   private long pow10(int n) {
- [  K) ?6 F/ Y: o+ A/ J$ u       long res = 1;1 X; y+ A2 k; \) e& ~  {
       for (int i = 0; i < n; i++) {" V/ F( W- x1 s: ^
           res *= 10;
( }" V1 g2 H1 g% H6 g# i      }/ M# O. K$ `6 c  ^$ Y
       return res;
3 v3 L6 L4 O$ \, Z6 x  }
& Z* q% G2 O" i}
4 F, D) @# x% c1 _' r: O
" I. a. y$ s1 |, P9 j0 U
% `' `2 m" ]! \3 N' H" l' `【 NO.4 从栈中取出 K 个硬币的最大面值和】" T! x) l: Y, b
! d) s# s  J. j
解题思路
' `5 h2 g# A& A9 w9 X6 E* R典型的动态规划问题。
1 Q; U7 `4 ^5 e) R2 s3 E( m+ k
; D4 W! y8 c( a. O* t/ Y1 [. o定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。7 j$ O* h! D4 e

# p$ N( ^1 `4 {0 B+ q. D状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。
0 E0 x+ Y6 y+ U( e4 l9 \+ b/ P# X0 s/ l8 R$ P0 g- U9 ]4 {
代码展示
9 D# I- e7 v! r: f
- H, X) M0 \1 i) q. N( ]7 Bclass Solution {( y/ ]# ?  y4 {3 M
   public int maxValueOfCoins(List<List<Integer>> piles, int k) {
( a2 u) g1 \9 A) |5 n2 x- [' w       int[][] dp = new int[1001][2001];1 X+ A' R5 w9 E; R4 b* m
       for (int j = 1; j <= k; j++) {5 x% n5 T' \: h: o
           for (int i = 1; i <= piles.size(); i++) {
/ q6 a+ G$ N$ x( m               var p = piles.get(i - 1);# v/ W/ ^2 f; C% g
               int sum = 0;5 \0 B0 ~; c# ~8 v- r( S
               for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个8 c/ C- c' E. L: |! U6 b+ I# [
                   dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);
/ U! X/ b- j! ?5 b% T5 E* x                   if (t < p.size()) {
/ j5 i% X* w# {! C                       sum += p.get(t);
- a) s: A' y5 p' X                  }6 Y$ L! v% i3 o; B: g2 k. {4 p
+ T$ Z" q; p4 E2 `
              }, {1 C, V% |' U+ z' i
          }3 w' m* v/ a8 P8 n) \4 M
      }4 U7 P6 k  R. b- p
       return dp[piles.size()][k];
& ?& J  M% R' T& n) T  }9 l' V9 C8 ]9 D% Y  A9 @
}
1 |7 l+ V) V9 J% M
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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