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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出两数组的不同】5 |6 w8 U, w' g. r/ o/ ^( A

5 o# g1 y" E; `" M/ ^4 U* g解题思路
! H8 n% \9 x( W2 `可以使用 sort + binary search 求差集。
$ Q9 `: R5 l5 v9 R
* z5 h8 L0 g5 I/ y1 O% g代码展示
% A' r& i5 E6 m, ]3 B0 J6 V* K  j# K1 Y- Q! S9 i$ F5 `) I  m
class Solution {. u% n8 T: ~* I) Q
   public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
! ^- s6 G  n! ?       Arrays.sort(nums1);
$ ?; h0 _: [' R- [5 R/ e  G0 f" c       Arrays.sort(nums2);
: z3 T: a. F" n( J& d. M* k5 S       List<Integer> res0 = Arrays.stream(nums1).% z: c* d3 E& m" V; L4 m# X0 N# O
               filter(i -> Arrays.binarySearch(nums2, i) < 0).. j2 c/ y9 i8 ^& e1 M' f* \
               distinct().boxed().collect(Collectors.toList());, ]" \% w6 {8 m0 z! V! ^
       List<Integer> res1 = Arrays.stream(nums2).1 a/ V8 W, D% U$ v3 G3 G; h
               filter(i -> Arrays.binarySearch(nums1, i) < 0)., D+ y' s9 o/ g( M2 `/ W+ D, a1 A
               distinct().boxed().collect(Collectors.toList());
& g, Y; a' P! V       return List.of(res0, res1);
( }8 m2 {1 X: _* h& C9 d  }
& e; f" c' @! Y; A% N# r4 `}; Z6 @; c  z7 q1 G- T8 V' C  G/ g
2 Z# Z! d$ v. ~: ~0 y, S

" m2 \; J8 U# X7 V【 NO.2 美化数组的最少删除数】' Q. s7 C' d& u" {  |8 C

9 ^& z5 K5 K" Z* X3 \+ L7 S# ^0 W解题思路
* C6 Q7 |- V  [从左到右遍历即可。) ]+ Q( R' y% i& y6 t( U& U5 }

/ D! c: A# v# C- j" J; M0 @- M代码展示, O1 l4 b0 I0 |

$ k6 [3 u2 O! eclass Solution {7 N9 t/ `+ F9 a* V: ^  ]
   public int minDeletion(int[] nums) {
* H' l" p  t% p; @# V) S" u       int res = 0;5 G+ Q3 O: [7 F" F+ ^- H, z( O
       for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同
# I# g  b0 i% x8 M           if (i == nums.length - 1) {     // i 是最后一个,应当删除% E2 a% t4 K/ _2 S; I, ~
               res++;
+ x; I& ]* n( L               break;' h2 B1 v- C5 s" U. |
          }
, ?7 D  J# ^& [+ }0 J  ~" k           if (nums[i] == nums[i + 1]) {   // i 和 i + 1 相同,应当删除,相当于 i++
' z9 T- M) G3 }, [% a" o* m# \               i++;# j2 K/ P: ^" V) X& h
               res++;
) z( |& G. ]$ W- j& u9 Y          } else {                        // i 和 i + 1 不同,可以保留,i += 2 以判断下一组1 t$ f& q$ v+ f% B( ?. h, E
               i += 2;
$ Z* J8 y  Y5 k$ g8 ?          }1 c: S3 {( d( b* x% \% G0 C
      }/ l( P& ?* ~3 ^2 P" f
       return res;" `/ q) Y5 J  r8 D# O
  }! A+ d. O. S7 ]8 L! h. y4 b! K
}
) L& p% J/ Z4 i+ G. R7 `# o+ M5 }9 d* ]; Z8 o4 J

& o! k; B% N, F; b【 NO.3 找到指定长度的回文数】
7 I% F7 W8 \' C$ U9 m3 R
6 v$ J# Q  c7 U0 ~1 W6 d4 }解题思路- A$ B# ^; `  _" L
举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。3 Z! H- z, A9 i: r
* j/ m# _; ~6 m/ E4 c. e
奇数长度的回文数在复制出后半边前去掉末尾数即可。2 y* R0 F: D( w& s# i
* ~& \8 h+ H' M
代码展示' K; [9 B7 w3 F0 v& W$ v

+ C( W: j1 I0 e+ Vclass Solution {! I9 y! M" {$ s) v8 s
   public long[] kthPalindrome(int[] queries, int intLength) {; V( N% R4 W/ ?7 q1 @
       long[] res = new long[queries.length];
* T5 y8 S) c4 N! u/ {       for (int i = 0; i < queries.length; i++) {- ~! J9 P$ L+ \
           res[i] = kthPalindrome(intLength, queries[i]);
- a& \% e, c1 j5 h2 D/ c% G  y      }' D( x& L! K* |: b- g9 H( X
       return res;
; |" e8 j  f! O5 g  }! u) I4 C8 y) j6 l0 t
6 u! z7 Q8 h( K# h
   // 返回长度为 intLength 的第 k 小的回文数( C- t6 _/ r  d6 c% s+ e) ?' L3 p
   private long kthPalindrome(int intLength, int k) {; n0 i# S, x2 [- M
       // 处理偶数
0 Z4 a0 u9 j% X+ G       if (intLength % 2 == 0) {) ?# |, K0 N8 w' a
           long half = pow10(intLength / 2 - 1) + k - 1;% P. X0 s# H% y; Q3 A
           if (length(half) * 2 > intLength) {$ I6 x) v( A5 R. z0 q5 }- E; m
               return -1;6 {) I8 c* [/ p9 T0 K6 b" J# G4 b
          }
5 g& m3 _; P/ _; @! ?- B           long res = half;
3 W  L2 l- J2 o8 c# ]           while (half > 0) {
! j' s. |+ C; f, U- _4 E" {               res = res * 10 + (half % 10);! i" D. J. {7 w. A9 p1 x6 H. c- M
               half /= 10;
4 \" Y8 m1 G  p7 {7 o6 n; t1 z          }
$ x2 N' j/ }9 y3 b6 c2 l           return res;5 i! P7 M7 L# v8 J  g
      }; B3 m+ |( Z# z
& H' Q6 H0 W7 p: f
       if (intLength == 1) {
! x( L, p" X# l" l3 t+ a           return k > 9 ? -1 : k;
- m) d. P2 h0 F2 A2 w      }
9 @6 {1 o* ^9 w+ I6 q) t, Z% V6 D/ @" L, I4 G% W
       // 处理奇数6 J. O! g  E9 |4 x6 \
       long half = pow10(intLength / 2) + k - 1;7 e5 O$ y; _, d
       if (length(half) * 2 - 1 > intLength) {5 Z" u: p. f/ w- o& m- G; U+ h
           return -1;
  I. |3 S' H0 @      }
  T; Q; u; w) J& k6 l. U2 ]4 P! J3 [       long res = half;+ i$ r/ A- N8 N  b
       half /= 10; // 去掉末尾数5 ]6 n4 J7 V( ?1 c) c
       while (half > 0) {
3 f+ D1 L# W% L9 u% M2 X! i           res = res * 10 + (half % 10);! @5 T! T5 y2 c2 v2 A3 t; z) l
           half /= 10;
" J1 ^+ L5 w9 j; F      }" t" I" q: T7 f  L; H( m- F
       return res;7 c6 O" I9 i, }% ]! {$ s, U
  }
+ o0 H# p1 Q2 b! }  S6 l
6 F  k' M0 U2 x! [, U" `3 n, Z' P; a   private int length(long n) {
6 x' _4 k& t) w% H- Q       int res = 0;% D7 R. L  V" ?
       while (n > 0) {
* _/ O) K8 y$ e" H           n /= 10;& e+ r: T  X4 G8 h2 R
           res++;
, H& O5 L- F. Q$ W$ c; R      }
) f% S7 a; _6 K% E2 b9 n2 q       return res;* a& A% ]0 g, d
  }
/ }5 _5 o8 {) z
# ^. \$ T: z. n% L7 G& h) R4 c1 D   private long pow10(int n) {
- r* D' `; \* \0 C1 S       long res = 1;
  e. I: r) W: ^% k6 |' o9 q       for (int i = 0; i < n; i++) {
+ T! @$ k( y  @1 R2 C           res *= 10;
/ I' s' U& b" e1 b% K" T% A  u      }  m; Y  |/ A0 S4 k" _: G# S
       return res;: N' Q+ x7 h) f9 r
  }
" y$ e) G0 J  z1 U+ W0 R4 x}, [- p6 i' P" l% {7 P5 J
4 E/ m& u! @& e! t) t; _/ m
8 F# l5 @- P0 c% O% ?4 [
【 NO.4 从栈中取出 K 个硬币的最大面值和】
$ f" s, h9 k; [8 P
% r# x+ \7 w+ z6 _8 Q) h, S解题思路- l( |, q* ?2 d) j
典型的动态规划问题。
+ |' @. P7 @1 `+ s
$ n! o9 p3 C, V6 N+ }定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。7 t$ `  l" K- Z
" h4 M% G3 `" p% [; k
状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。6 \5 e$ d! h1 i+ t9 L
4 k2 ~( z  Z/ X% M/ Z
代码展示9 E* T0 S. d6 P2 B
# p2 K* n: j8 L
class Solution {
2 z3 y# r' G* f9 n   public int maxValueOfCoins(List<List<Integer>> piles, int k) {
; I" ^" N' ~$ s2 B2 v* X       int[][] dp = new int[1001][2001];( r6 H4 [8 F! i4 K: i
       for (int j = 1; j <= k; j++) {+ b, H0 n" I) ?/ C% l% T. d& |
           for (int i = 1; i <= piles.size(); i++) {
2 l6 B$ o; J& J( _5 z1 _               var p = piles.get(i - 1);
. h+ V1 b0 s4 g# Q% W               int sum = 0;% g" Y' d( N1 G4 \
               for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个
' r/ R# e) y5 g/ b                   dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);4 w5 Q  v3 G. h& k+ ?6 J$ w
                   if (t < p.size()) {8 B# v" e5 l/ [" F
                       sum += p.get(t);
1 ]3 x9 f5 p' J" s$ Y9 Z                  }
' Q& x- O" j+ n! R9 h+ x' S: t
6 w; b! d3 _" g0 J/ Q              }
6 S: B  x% S5 e) W1 K' y" ?          }
! @$ U3 X" j) o# t8 h* t      }
) G$ N" Y- Y0 t; E& q       return dp[piles.size()][k];
( }; y  Y5 s6 |* p  }
+ ]/ n6 l2 w0 ]( x$ p}
, R8 O. c- W0 V& v0 k
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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