找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出两数组的不同】- l: w% S% x; M9 |9 {

4 o# Y! N& q- g* t7 p: h" B  w解题思路
3 K; D) H6 O# }2 W' W可以使用 sort + binary search 求差集。; a" R% ]) D, \) e9 J0 D

# x1 ~1 y7 N: V代码展示4 H$ o) r& s: x. t
. _; }4 W, J- s3 r* j
class Solution {9 |! _5 a$ e( z8 @7 W
   public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
1 w9 o5 C1 e, S  Y. h& g+ X6 @# D! `7 ]8 b       Arrays.sort(nums1);: f7 v' S  j: ^  L7 j
       Arrays.sort(nums2);+ q' ~/ T% w, j
       List<Integer> res0 = Arrays.stream(nums1).1 X3 A. V: o! T/ W
               filter(i -> Arrays.binarySearch(nums2, i) < 0).
# y0 R1 w" w. G* C4 A5 [               distinct().boxed().collect(Collectors.toList());
8 ~2 a! M) M4 X2 p9 C: P       List<Integer> res1 = Arrays.stream(nums2).
8 v: B$ @. m$ m) _               filter(i -> Arrays.binarySearch(nums1, i) < 0).
0 N7 A- a. n8 M               distinct().boxed().collect(Collectors.toList());7 a: m& M+ \: }
       return List.of(res0, res1);
# Q" I, B$ r1 k; A& ]" M  }
3 K2 Q) m7 J0 s2 O9 l8 _}6 M/ A+ Y. C5 h) J
4 I# H% W7 e& x1 ]

+ U! Y5 \( a% J【 NO.2 美化数组的最少删除数】
% G4 p, f& {* n6 _" ^$ ~; P- q. T
3 Y3 @6 r# a" M4 W解题思路7 C( L2 b" z9 v) O
从左到右遍历即可。7 r/ x0 I; @( q( g: ]+ D4 s
6 {- V: Y& e* f; a( |
代码展示
. n8 k, M6 R  v0 Y4 n
8 x& Q2 W% p! T! R2 G0 H0 v7 y2 iclass Solution {
, t0 q! c; F. k   public int minDeletion(int[] nums) {* R* P6 o3 z5 ~' ?$ e8 `, u7 r' @
       int res = 0;
" l. |. M; l. g* ~/ A+ W1 [       for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同! |  u5 V) m4 O
           if (i == nums.length - 1) {     // i 是最后一个,应当删除
- I* e/ Q( l; b0 G5 G) G               res++;' x) L, s( T. I; s8 j7 }  n8 D
               break;. J* ^% ?$ N" F, N: L! E7 `
          }
% N/ c& y6 x& G. G, m8 L           if (nums[i] == nums[i + 1]) {   // i 和 i + 1 相同,应当删除,相当于 i++1 ]% ]: y5 K( W6 L- L8 `$ I- x
               i++;
) m) k/ h; C2 W. h6 G+ P               res++;
6 Z2 t; q# ]7 e& O3 e9 Q3 B          } else {                        // i 和 i + 1 不同,可以保留,i += 2 以判断下一组
/ G8 C+ J! t& K               i += 2;
& p* Y- S$ ^% x9 \: |: d: s. y          }
) X0 D7 {$ M' i+ d4 _7 \) k      }
3 g. t6 d, W- e9 M       return res;! y$ \3 e" J, j
  }7 I4 w1 A. j' ^
}
( r! v% r- G& K# V+ @$ h$ u$ `1 S8 g6 m
$ a& e, q9 t3 R$ d& s5 {
【 NO.3 找到指定长度的回文数】+ M. ~, e8 r  C+ v$ Q

0 L( ~- Z/ w+ J, o+ Z3 S7 }解题思路
3 N$ s6 |6 ]2 u! x; w举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。
3 M' K9 M2 r# o8 D3 I
3 W( o7 h. B8 E0 }; [奇数长度的回文数在复制出后半边前去掉末尾数即可。
& a& [) s3 d; e9 C0 e
$ B) }# K' J( |$ G8 G; l9 S+ X6 N代码展示
: c1 O9 b) e( Y; K( P
5 n& h, S+ o7 h# rclass Solution {; `' S' |% f3 E( u% @4 F- U
   public long[] kthPalindrome(int[] queries, int intLength) {
, D) }7 g' u  P, D* t& J$ ]       long[] res = new long[queries.length];
0 m# D) e2 q! r2 H5 Z6 o       for (int i = 0; i < queries.length; i++) {
) c6 L7 d9 Y; K' M9 j. u$ g           res[i] = kthPalindrome(intLength, queries[i]);' T3 x- E  Q5 e' I" L7 Y$ B
      }
# X: x. I; U# G2 j       return res;
$ |1 G1 L! I, o  }
/ C/ ^# m0 A1 a* M
) }* v4 X) l% s- f: T0 Y   // 返回长度为 intLength 的第 k 小的回文数
: L, R( ^5 f0 m) y/ ?+ ]5 v   private long kthPalindrome(int intLength, int k) {
( L* b8 Z  l( p! @       // 处理偶数' J# a, N- o! U
       if (intLength % 2 == 0) {5 l" ^( X! f& k( Z" A! E
           long half = pow10(intLength / 2 - 1) + k - 1;
' d1 ]1 q: r* R/ T           if (length(half) * 2 > intLength) {7 l2 T, N" y7 Z$ K# G
               return -1;
. ]2 w' w) `# k' u1 f! P          }
( b; p7 P0 z) C! B. l: Q& F           long res = half;
1 P6 q1 E0 l2 S3 ]" q1 m/ o& J           while (half > 0) {& x) X% m6 ^  l
               res = res * 10 + (half % 10);; h6 t! Y7 E" E* Q
               half /= 10;/ w7 K2 _* c; b9 y" ^
          }
/ f+ K% u1 O/ ]+ L* H           return res;
. q: ?4 p" g6 I  J5 _3 \/ b$ s      }# y  A8 @4 m7 f( W8 L

* f1 D0 [* \& W       if (intLength == 1) {
6 U, E0 v4 T2 e3 Q           return k > 9 ? -1 : k;' f( c& \. e$ k) r- H; v9 x! v/ g
      }( c# h. _2 u) Q$ |: d$ L

! A2 c% @5 A' [9 N6 k       // 处理奇数
3 g0 [% v' Q6 {3 g       long half = pow10(intLength / 2) + k - 1;& a1 ]% Y+ d3 P" E3 `
       if (length(half) * 2 - 1 > intLength) {# {0 P* k$ o, o. s6 M7 D4 f% k; N
           return -1;
& U  y$ }; f3 d( ~$ k      }+ G: F  |" f# }' W, T$ g0 K
       long res = half;
/ e, i6 C3 w) P% F7 s       half /= 10; // 去掉末尾数$ y/ K$ r$ j  m7 D7 P
       while (half > 0) {
& c. a( P% {/ f* D$ k) p% X           res = res * 10 + (half % 10);
, T# E/ T- h9 q$ i0 E           half /= 10;
& g, |" ?; [: O: m6 t  j9 d      }
8 ^1 G' J0 i, r0 q( x) S8 h       return res;# U, i& }9 r# a; r
  }- U- [0 h' X3 w! M; W8 H2 i9 Z$ J
  Y" q+ ^, r2 [5 R- }* V+ R0 K
   private int length(long n) {1 `, F# J. d  {' P
       int res = 0;: a& _' D7 P3 M
       while (n > 0) {2 x+ N* c3 c! _9 g0 s+ q6 h
           n /= 10;5 `4 ?- ]. p9 k
           res++;
5 n& @  E2 Z) |' }1 R! H! q1 [/ ^7 L      }2 h0 {! V7 a- ?, r0 q
       return res;
$ t( J, t9 b& g  }1 U1 v. d! o6 j
2 A4 {6 i5 X, A" k* V2 |0 F
   private long pow10(int n) {
0 @% n2 o; ~0 U+ O- Y       long res = 1;
$ {2 ]4 e/ p% N9 j. H# u2 p       for (int i = 0; i < n; i++) {; U5 D- r7 x2 p" E* f7 P
           res *= 10;6 x) `1 K% ?  ^5 t, _, j
      }( m1 o& s' c$ ~" r1 p! D, {' }
       return res;3 P* t  s8 A# L  ~
  }8 ?  @6 P( U- l6 ]$ `) \( P, h9 `8 A# ~
}
" Z- r' L* ?4 ~  U% r" h$ {0 O9 q% J+ {; t4 z! C& r$ T+ f  c

+ }  P- O! |* v5 [5 `% [+ L( X/ S【 NO.4 从栈中取出 K 个硬币的最大面值和】
  `( _7 |0 M  e8 b0 h
$ Q2 I8 W2 q7 o  o解题思路
7 `/ }2 f9 t8 _/ [/ M  V$ T; j- M, y+ T) {典型的动态规划问题。5 ?# [6 ?& s$ t) a" w1 O1 \! \+ m

$ J' Y/ M; U4 b  V. v定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。
5 I8 r+ Q7 e  T1 h, n. s' A3 I  U6 k9 `$ d' U8 a! P
状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。
- A7 x7 Y9 ^( R7 r- w! H  p
( ?- C2 p8 @9 [3 D' I+ ~* P6 T代码展示
: O8 ^$ k# `/ M5 R" H0 q+ G' u2 @# L8 f9 ~' G7 k3 X
class Solution {
, K8 Q3 d, v0 B0 i   public int maxValueOfCoins(List<List<Integer>> piles, int k) {; E  B/ O# f1 u% n6 q& `
       int[][] dp = new int[1001][2001];6 S0 D, Z: k2 M$ E/ s# g2 v6 \
       for (int j = 1; j <= k; j++) {
& s5 W6 M5 y6 V3 |; E           for (int i = 1; i <= piles.size(); i++) {7 ~& C) ~- o: k% i; s0 u, r- u
               var p = piles.get(i - 1);
7 z1 k) ^0 t8 [% x* M! r               int sum = 0;" h( y2 x( c' N/ C
               for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个, x. W/ u/ j) h# d* C
                   dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);
4 w8 s& A6 `6 K6 @2 E0 J                   if (t < p.size()) {3 F5 p3 {2 _' u9 k  l+ k# O
                       sum += p.get(t);# L. @6 j! G3 V9 ^
                  }
- ?" ~. Y7 ^! E: b% W2 q5 _8 C  c" b% e/ p7 W* i2 [
              }
6 N0 v' {$ b/ l6 l' X1 e          }# b. y9 ^" |2 q' W
      }$ Z( F3 a( Y8 }. {; }5 e
       return dp[piles.size()][k];) L' M9 A8 ?% V0 k  \
  }
  E4 O% Y# y# r" j3 n# f' r. y1 F}0 \( e5 T9 {" n' N1 I) w+ ?
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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