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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出两数组的不同】
4 l4 w+ N* i% c) }" ], y  E3 m' ^$ t1 x* C. M, ^! S
解题思路
+ j7 y. m0 ~( A1 Y& z2 @可以使用 sort + binary search 求差集。
3 H; X3 Y/ N+ M0 |( E! \  m
+ r8 ^+ Q0 z% v. z9 ?: p( C! A代码展示
  W% N2 k$ y1 ?4 D5 [/ b' W6 ^8 [: y! z5 [0 l8 f, `
class Solution {. H7 o3 L0 O! D1 ]( z: w" w
   public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
4 u9 \- l; o% @$ g3 g  T5 S       Arrays.sort(nums1);
% t* Y& L- w) ^* m8 A       Arrays.sort(nums2);
2 r5 D# W8 U; W5 ]2 R7 O       List<Integer> res0 = Arrays.stream(nums1).+ }6 V3 h0 ]% J$ |5 r# `
               filter(i -> Arrays.binarySearch(nums2, i) < 0).
1 T) N/ n7 }1 R9 \$ ?* V               distinct().boxed().collect(Collectors.toList());
. {3 [0 h8 R" G9 Q- p; z# N       List<Integer> res1 = Arrays.stream(nums2).* d/ @& b; {" ?9 h) a
               filter(i -> Arrays.binarySearch(nums1, i) < 0).
- ?% r( j, B3 E7 D               distinct().boxed().collect(Collectors.toList());
7 p8 o/ k6 }3 g: N       return List.of(res0, res1);
/ @# b  O9 g1 Q- u6 s) c9 Z+ d) I  }
) B* h& E% s& H6 y# G}6 n& k: F6 A. |" S! q
# I# _- s5 W5 D

, `) z# i; R- Y2 F( z7 m4 q3 Q8 X0 r【 NO.2 美化数组的最少删除数】
3 g2 p6 W, V1 R) `$ a" K! n. c5 @$ N. F2 T/ m4 P
解题思路
6 I# H9 z' Q5 \5 H3 R1 t) W从左到右遍历即可。' d" c' i) O5 v# Y

7 l0 U4 r  o3 X% J/ M代码展示
2 L) ]4 x- V5 {  @: B7 [1 r
8 K# _7 L3 z3 W3 H) ]class Solution {' n/ M3 k4 n- _
   public int minDeletion(int[] nums) {% A# Q7 q% A* G2 C( A
       int res = 0;
* T; B0 O' ?: o  T7 E/ w; }- d       for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同# F0 Q! i3 d: t) M6 e, s
           if (i == nums.length - 1) {     // i 是最后一个,应当删除# M2 q; `5 K2 q( C  P  i
               res++;) J! M/ n/ s5 t
               break;3 I/ {3 j1 g3 i7 [6 _
          }8 z: G7 U4 l0 s2 L
           if (nums[i] == nums[i + 1]) {   // i 和 i + 1 相同,应当删除,相当于 i++
$ X1 E, y( u7 ?9 `               i++;
" [$ b% k, F5 k) e. v1 e" @$ r5 L' R               res++;
8 |# z' o0 z; Q- |$ ?          } else {                        // i 和 i + 1 不同,可以保留,i += 2 以判断下一组8 ]0 d" ^& M0 h& g! ^6 P
               i += 2;
4 ~2 F4 t5 n, ~" ?* F: X          }0 B. v: \4 L. b' B3 C( t  Q* L" V
      }1 z$ U( o4 H1 G: p$ `
       return res;
9 E7 @6 Q* M; H: ~# s  }
3 f) `( ^" d6 q8 ?7 y5 t}
6 X+ d! M% a/ U0 C* N! m+ N' ]
" X9 Y' I) ?5 |$ K
, ~6 q8 g4 `: R* c" Z: J3 r6 i3 J【 NO.3 找到指定长度的回文数】
% n; h- C* s# q4 ]9 z$ Z4 X& A6 o' v0 y( D: V% a; k7 F# i
解题思路% z) a5 X* k" Z% E, S* S
举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。
8 `, q0 S- Y4 t0 D8 {. f3 r+ Z% b0 ]1 ]. G' F
奇数长度的回文数在复制出后半边前去掉末尾数即可。1 I; Y, x6 h7 p. j9 G' {: m

. @* e3 S8 ]& _1 t- }6 t+ w代码展示
# M( o7 m/ Y' _! E. _0 e0 D2 k4 ~2 g& B3 S& x- V3 y: b1 W0 g, D
class Solution {
8 J4 a( P# X- R/ ]$ A9 {   public long[] kthPalindrome(int[] queries, int intLength) {8 d% I* n6 s& `4 ?
       long[] res = new long[queries.length];% J4 a& @7 r2 ~& J6 L$ ?* q4 z
       for (int i = 0; i < queries.length; i++) {3 l& Q& b7 s6 ]! n( n3 s
           res[i] = kthPalindrome(intLength, queries[i]);
% R# u+ H8 {/ t, ?; z      }
, P+ H5 |7 y- g       return res;
2 v# M* }# H% Y4 r  }0 V2 X& t4 G" C, T. T; r
& ?5 o5 ?8 D( X* j, S% X* u
   // 返回长度为 intLength 的第 k 小的回文数/ F" X' J9 o' L' M- U9 j
   private long kthPalindrome(int intLength, int k) {
2 v8 `) k) |/ d/ k       // 处理偶数4 ?1 M! j, F/ l/ D+ C
       if (intLength % 2 == 0) {
% D; O* I, X5 {7 d2 L. |$ F           long half = pow10(intLength / 2 - 1) + k - 1;
1 ^' I( q5 x9 O0 b4 s  ], M  C  a           if (length(half) * 2 > intLength) {
1 l2 l" i$ Z% |% m/ h4 T7 U               return -1;
% X# e' c0 P* L- E/ H; j! R, T5 L          }: L2 ^- b. @& \  k; J/ u0 e" o
           long res = half;6 U8 \% y* o7 S* M
           while (half > 0) {' r: m3 g- w  w7 S$ k, G5 j
               res = res * 10 + (half % 10);
* S& y7 X  I  t               half /= 10;! G% V0 L# _# i% c. K) l* `4 _% v7 N
          }
4 U7 J+ I" Q/ u* Z$ l- t4 ~           return res;
2 [+ x5 ?5 B. j* O      }1 g. Q7 B7 d$ @8 m" I! b

5 L' r, A4 V, G8 @6 C       if (intLength == 1) {# c/ Y6 F1 ~5 b& O3 M6 U+ o
           return k > 9 ? -1 : k;) Y* e* v8 P7 e
      }2 l# ?$ }; J0 G$ Z$ {
; T9 [  h2 P3 ?0 e8 j4 f
       // 处理奇数
# I: ?# V  ~$ I0 r1 l2 R7 U& D0 n       long half = pow10(intLength / 2) + k - 1;
9 X( }. M. A; P! q1 E1 O# O0 D       if (length(half) * 2 - 1 > intLength) {6 N$ A4 `; |4 {
           return -1;7 \8 Y1 ]: `( \; C' h" r8 a/ i
      }+ P, `" |* [2 Z1 }; L7 T% F
       long res = half;, y8 d" S& c$ L3 V+ u
       half /= 10; // 去掉末尾数
3 a0 k8 ]5 L) t& J       while (half > 0) {' g0 ~/ M& e$ ~/ B2 P( i
           res = res * 10 + (half % 10);% Q6 D" c- b5 ]* U, \  [4 O* I7 F" s
           half /= 10;
! t4 s: u1 k( H9 m/ U      }) x/ V$ K# \. q* I8 t2 _4 E
       return res;
8 v9 j* i8 Z9 f  }
: o6 r* `% P; f8 m+ I* b4 r8 n
9 K8 Z* x& a* F/ K   private int length(long n) {% M& d; G7 a2 `; y
       int res = 0;# `- ~) c4 r  c, a7 [7 u0 n
       while (n > 0) {
$ F1 X- |. X  |- X1 \           n /= 10;- e7 B! I/ b9 g
           res++;' i" _& V6 ^/ t0 b
      }
7 F2 @( f/ U* N. q4 M       return res;
5 S1 @# R' s9 H) }  }- m: x9 U; H6 x) Z( \3 n

7 K  ~- a1 V! P* ^) v   private long pow10(int n) {
0 ]- q; s  {) v: M7 |       long res = 1;
1 x) E$ S$ ^% B3 |8 f( t       for (int i = 0; i < n; i++) {- P" }8 I6 h$ J5 a; @1 e
           res *= 10;
3 R  w+ m' U6 }, @      }" f9 }: W) K: K6 @# P2 v; m
       return res;
  N* x1 }3 d2 r2 {  }
4 w% c5 k3 z3 e, o& z}/ X6 d4 J& o2 Q( Q6 r+ B
: g- E! e; S# F: p; N

8 x, @' `" `* O" I【 NO.4 从栈中取出 K 个硬币的最大面值和】
( R* R* Z$ O9 @# J+ ^  F9 c
+ C! k  D& c4 q解题思路
0 x! P+ ^. t) A5 B" i; m. a典型的动态规划问题。( h, U  m  U1 O  E* @

- m/ |4 r4 S) r定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。9 N, D' P8 L9 N8 _+ H! S  M
, N0 }" E: N8 a  l
状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。
* r' N" k; X1 ?, `& _# ~) T& |0 v
代码展示+ H/ R! u; @! e3 |* w$ Y! G2 {9 [7 O
7 L1 R( a7 ^) q% R
class Solution {
( B% ]) ]( F' `3 {: u   public int maxValueOfCoins(List<List<Integer>> piles, int k) {  r" ~$ g3 O7 E; Q, y3 r8 L& _
       int[][] dp = new int[1001][2001];
6 Z& R: v1 |7 ~! x5 N- {       for (int j = 1; j <= k; j++) {1 \1 O) a1 m' z
           for (int i = 1; i <= piles.size(); i++) {
. n7 S3 t1 c$ F               var p = piles.get(i - 1);+ [; u) @& u5 J; s
               int sum = 0;
6 K5 C. `$ s% M               for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个" E) U6 z" [' S! j* F3 }
                   dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);2 ~, Y4 I( v4 H9 e  z  r
                   if (t < p.size()) {, F7 s; J3 c+ U0 B2 u
                       sum += p.get(t);
9 ~* q' q2 n! H7 G$ V: q                  }1 K3 Q% o, O* R$ e! t0 O7 ?: k
* ]) k! C2 ?" |" y
              }* Y" D; s% ]0 ^8 m0 Y5 U
          }
$ [2 {' w- Q3 G' V' `. z8 O6 T      }
. Y# [% P8 U0 t8 {% ^       return dp[piles.size()][k];7 f( t# d2 k) z: y/ i
  }
8 Y. V( _( o" N}! W6 [. ~- _& t$ ^
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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