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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出两数组的不同】
# K3 M2 p* n8 ?6 S7 L
. _( s+ v* ?! i( ]解题思路
* ^2 M( [* z/ v, T) R4 ^9 Y可以使用 sort + binary search 求差集。" r! x! H' }( Y' W& K2 c1 |
$ b& Q9 P! ]* }6 S: D1 v2 t& @! J2 L
代码展示6 K+ l) U; U( ^0 _9 u) ^; n

9 p& S8 [1 s# z) M3 c2 \, fclass Solution {
) P) R3 b. `' N; }5 a1 X) v# ~   public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {  g* w+ a% g0 _' y1 F
       Arrays.sort(nums1);
/ ?$ u5 h1 W  m0 P6 T       Arrays.sort(nums2);
# t; G8 t6 y9 q% f       List<Integer> res0 = Arrays.stream(nums1).1 F/ W& Y) ~5 B3 q+ r
               filter(i -> Arrays.binarySearch(nums2, i) < 0).) q$ ^+ ]8 p+ n( x7 Y0 ^) ^$ p
               distinct().boxed().collect(Collectors.toList());% T6 L! B& m$ {* Y, J% Q
       List<Integer> res1 = Arrays.stream(nums2).
& h$ r+ _9 P5 r9 D% J! c               filter(i -> Arrays.binarySearch(nums1, i) < 0).! }( w5 ^4 N- n) ^3 J. g) W
               distinct().boxed().collect(Collectors.toList());' J  G6 u3 J- S( @
       return List.of(res0, res1);- d( g2 t( z: A& {  n
  }( o& @' U1 L* C- |! ?2 i" r- L
}) Y- i/ |1 H" C3 X

1 f; |2 }' E" @  ]; X0 R+ @7 Z* d7 o5 E! M% {0 w5 O/ I# S4 M0 f
【 NO.2 美化数组的最少删除数】+ z. ?  b) }  s5 t# n  |
1 t/ ]" g* u( i  P: f2 L
解题思路8 w+ P  y5 h! ^: ]4 l, c. O' f
从左到右遍历即可。" h8 N* a) h# Y5 p6 m

, T; I  v9 H5 Q, K代码展示
+ k4 B0 F* a. s8 b+ n5 {9 A2 r- C- i" p0 \+ C4 X& T& p
class Solution {5 t8 d! M6 k* E4 @: f$ b" e# E
   public int minDeletion(int[] nums) {
  S  `5 L" ~* O$ S2 i5 P5 p/ J  c, w       int res = 0;! |( T0 N( N3 M2 i( U+ T
       for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同' ?5 B5 H! {1 G5 o4 ]. V
           if (i == nums.length - 1) {     // i 是最后一个,应当删除4 a) _: \& ]+ V6 L. z
               res++;0 W  u) J8 C0 }, E! J0 n" u
               break;
# a5 }; N; [7 ?  {- l, P          }
- A- A! E/ B! G5 E. ]8 F           if (nums[i] == nums[i + 1]) {   // i 和 i + 1 相同,应当删除,相当于 i++8 e7 U9 ]& d# z- y" N
               i++;
& P* F& l* t& `               res++;
# T2 d) X2 V. t$ a- @' w# F: a2 N          } else {                        // i 和 i + 1 不同,可以保留,i += 2 以判断下一组
2 L; x' Z7 K! [! G& u               i += 2;* T: {  ^# l& D# W( {
          }5 q: P8 D( I; K0 t1 E2 p# \! M, w- x
      }$ [) |' n, [, ~7 ~9 Q) U+ L4 I0 \
       return res;9 k) E% U  l3 r; q6 H0 Y# ~
  }' |$ x2 V2 S  x6 K: C5 B% U
}
- c+ T6 `6 ], A4 Y0 t: Y) Q: q: _* a) L" o' R* S
% e+ i* _- F' y. y, y% @% Z) c9 H
【 NO.3 找到指定长度的回文数】% c; c* v3 E8 @: B7 ?1 Q: ^
/ O3 V  {  v' s
解题思路
4 I* p) @# T  e; s; F" q( U举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。1 c! r+ d. a. {) h
# Y9 O% k& T  I. p. {+ ?7 |
奇数长度的回文数在复制出后半边前去掉末尾数即可。( @4 j* e" y' Z; s
& @1 Z# ]4 x3 g& C4 D; p
代码展示3 a# v+ k, m, R  D( D: j- P

$ \, W6 P- K& c4 n5 k3 Y9 m+ zclass Solution {' |- R4 K+ W4 q! p' v+ ^9 R
   public long[] kthPalindrome(int[] queries, int intLength) {
" I: u8 t3 S" P# t7 R, y9 E       long[] res = new long[queries.length];5 G5 z9 D6 q9 H9 ~1 M  E
       for (int i = 0; i < queries.length; i++) {/ o0 I7 {  f3 S5 ~$ Q; X3 ?1 P
           res[i] = kthPalindrome(intLength, queries[i]);
5 b# D1 z' A5 ^! L( `      }* _* G" d; X5 J, v% q
       return res;2 y0 A+ N- Y; N3 V# ~) O/ {
  }4 |6 ~9 U' `/ p, R6 C  ^

7 o, D' `% L" _) @" W, g' L   // 返回长度为 intLength 的第 k 小的回文数# J! R  b' |2 k5 Z5 l5 N+ F
   private long kthPalindrome(int intLength, int k) {
/ g4 w; b: A! T! X- ?" f2 j       // 处理偶数" H, M/ X9 D: p; L6 ^& x' j
       if (intLength % 2 == 0) {1 Y0 E1 b1 z5 p  r# G) }
           long half = pow10(intLength / 2 - 1) + k - 1;$ ]; K, z" Q* L' D* O: ~$ [
           if (length(half) * 2 > intLength) {; V2 s% o0 t' u  o
               return -1;
) o% K0 b! N/ X  n          }
' Y8 o0 s$ `: h) a8 v% ~/ X           long res = half;8 H  T) c1 I! H% W$ H
           while (half > 0) {. a3 T% E0 m" G5 k. h
               res = res * 10 + (half % 10);
5 }1 @# q# ^7 L% Q9 Y: p: c               half /= 10;
. \% f) j! I6 B' S6 V8 u( v3 G          }
; Z% R; `' M1 |- H$ q, ]3 F           return res;
8 X; W+ |* e7 v- j6 H" R+ c      }5 d: X; w' y6 U% @& Z) O

/ p1 O9 U# t9 _& {7 @& R" n       if (intLength == 1) {
- e7 }: [; Y( z* k7 L           return k > 9 ? -1 : k;0 g; U7 e! ?8 B7 v, b
      }
8 U# l9 `3 i6 ]4 ^. l; ~( Q6 D: [) ^! @- h" N* e
       // 处理奇数' R+ t6 v9 b$ ?8 d& i
       long half = pow10(intLength / 2) + k - 1;& `0 `1 O+ t, w  E
       if (length(half) * 2 - 1 > intLength) {$ Y( @7 i) D, y4 H
           return -1;
( i; }0 `- v" A8 U$ a' m# ~      }1 ]% G& `& s) ^8 v- S0 c! Y4 U
       long res = half;
2 Q$ f" y/ V2 E0 Z1 j  r( B( X       half /= 10; // 去掉末尾数
( h& w3 o' @- b' x2 R       while (half > 0) {
6 d+ G$ Z6 F1 q) M           res = res * 10 + (half % 10);( r" R+ W8 A# h# k& x
           half /= 10;: P7 }/ A1 P+ D5 f7 `
      }& c  K, b2 I. c4 I' g3 S
       return res;
- O  i5 b$ n$ B7 Z+ x$ e8 i+ l; P  }5 {$ D4 y7 W9 E" z  ]

, f) G' t5 F9 [8 }5 |  A" M0 t/ S   private int length(long n) {
  q) R$ b' x. s% j       int res = 0;8 e! v( g: {6 y
       while (n > 0) {
8 k3 g# A* _: I9 [! ?/ [           n /= 10;5 `0 @9 E" a5 h4 _
           res++;: S  v" Q  ]$ z. A' A! W; i
      }( g9 \% q) ~" t# F; d
       return res;. i* b' t6 [& |, K. m  Q
  }
4 F7 J) }$ w" {9 I  V
' u* R8 |* {' m  F4 _   private long pow10(int n) {
. j2 g9 M, _$ o  F* L       long res = 1;
) k) r; X1 {7 y3 {* |) l) T' y       for (int i = 0; i < n; i++) {
4 ~% k" T* U3 Y/ J% M           res *= 10;
+ p1 [: S/ i6 d* b% M      }8 A8 [3 T* U! d, ^2 x8 J
       return res;5 [& ]2 z' `' e3 O+ _2 x
  }' a1 c% K( C0 c9 c- h' `+ I: U
}
7 h) O7 ?2 h( O9 b3 D( D2 H$ J4 w  k# T& S; G9 o
0 L0 {7 D  i7 t7 f/ t! Q
【 NO.4 从栈中取出 K 个硬币的最大面值和】2 X2 ~1 k, Z" S5 J5 h, i2 j/ M

6 w) S( W) C; y9 N7 |6 ?解题思路
+ B9 Z5 O$ y9 e1 i4 l/ @典型的动态规划问题。% J  m7 ~* ^; a9 t  C

4 L( F4 H6 H% i/ l$ A3 D定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。
' ]* \8 |# X  ^% j; ~3 L! E4 x
. N' }) ~; Y, r% w状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。0 h* I" T  E, X8 P

4 `0 Z* u- V5 U. R代码展示
. H( J$ @$ z' n! G; K7 \6 K/ U$ v0 \; U- {: p( j6 T
class Solution {6 b9 w1 _% @  ?+ l
   public int maxValueOfCoins(List<List<Integer>> piles, int k) {
) P( S' V+ B' D8 f4 D# R0 i9 m       int[][] dp = new int[1001][2001];% k4 j: ?6 D. P+ `
       for (int j = 1; j <= k; j++) {
/ G. b2 q. n3 `+ W% O, L: j           for (int i = 1; i <= piles.size(); i++) {& K) q6 r) I# U  x
               var p = piles.get(i - 1);
9 K# d# e9 D4 a1 L               int sum = 0;0 u: [* ], T) K5 r
               for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个% u- f' e; F- A  v' f
                   dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);, C5 m- L! y3 y
                   if (t < p.size()) {
* K0 P7 k6 h2 S3 j4 D) g9 B& a1 `) f                       sum += p.get(t);
4 r3 B# ?9 ~0 s; d0 a2 I9 I                  }- d& d( U. H& Y7 u$ B$ B9 u5 }

. S: q( y( r( r7 e# j; m& @5 m7 a) j: ]              }: A, @( h  i, W' F$ c
          }2 ?% ~& y: E, O* V+ F: @4 g* ^) \; N
      }) h  u0 R0 Y. t
       return dp[piles.size()][k];. }6 O" w7 f, k) }& [; i
  }
2 Z; i* C8 C( Y0 ^5 |9 O2 W}& T* f5 d( Q* m4 Q9 o9 X8 I
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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