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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 找出两数组的不同】/ y$ W) v/ P4 g

4 a- m' h: Z+ g8 d9 A) b7 ?解题思路
4 ?. e& P/ _& d6 E, U! L- e可以使用 sort + binary search 求差集。  R# N  i% H; o0 {- F0 C/ j; y0 }8 p
) [- [5 b# J3 f/ {% O$ N
代码展示# D+ I: P( K& Q

! t! U6 ~" p8 q& N8 gclass Solution {& ~1 d8 N. x8 H8 F! G" {7 j
   public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {$ G2 z$ e. w# Q0 c
       Arrays.sort(nums1);' h' n8 ~; n+ W
       Arrays.sort(nums2);: p/ |6 E  z2 s" E' w
       List<Integer> res0 = Arrays.stream(nums1).
1 }' `* w. _* l/ O  w4 o" M9 B               filter(i -> Arrays.binarySearch(nums2, i) < 0).% J, l. A" O) D1 l
               distinct().boxed().collect(Collectors.toList());
6 ?! l& k: f+ Y: j* z       List<Integer> res1 = Arrays.stream(nums2).
% R1 F7 i, n# _/ n6 q               filter(i -> Arrays.binarySearch(nums1, i) < 0).
5 S8 r6 Q- e& {# M               distinct().boxed().collect(Collectors.toList());
1 q/ i7 v6 f( O- Z       return List.of(res0, res1);! ~6 `% ^8 ?+ N" q' O8 s
  }, r" A# R# Z; U* x! R. Y& {
}. Z" |0 c: \3 {/ v
! ~! n3 i- K) W# L- H. y( s: R

0 Z7 k" \. O; X  B7 o【 NO.2 美化数组的最少删除数】( R% X, H4 J: j5 K, \

" t. x  O9 p2 a1 h$ M解题思路
4 v7 @1 f; i7 |8 u4 b2 o, V$ n从左到右遍历即可。! _6 T7 D- ~4 ?  X( L/ }! g
2 K# D0 B3 v& n; `$ u1 ?/ o* O
代码展示$ N' R" N: [8 e
& y1 ]: Q& m* w; }
class Solution {
  H7 X. D9 ]2 `/ s' `1 L   public int minDeletion(int[] nums) {) l: |! t; b; }
       int res = 0;# c- |4 f' U; V5 j
       for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同$ C+ ?* f" Q+ @2 W* @
           if (i == nums.length - 1) {     // i 是最后一个,应当删除9 Y$ m4 \( @" h
               res++;
; e1 M9 A1 a( x1 m& _               break;
% b& Z# W$ B) ~; z! `7 G          }
4 e! w6 P5 ~* G; j- _           if (nums[i] == nums[i + 1]) {   // i 和 i + 1 相同,应当删除,相当于 i++
$ A0 b+ ]1 O+ W, y               i++;* _# B$ Q. K) u) {; _8 o( b3 X7 J
               res++;$ q7 A# g. |5 h7 m' H
          } else {                        // i 和 i + 1 不同,可以保留,i += 2 以判断下一组. g: I: J( \  m2 b5 x! R- A6 t- R
               i += 2;' ?% w! k& J, M; I# q8 w
          }
. f- c- a( C* l  e      }
7 r) b1 j3 H4 C# ?( n# n       return res;/ V$ j: W+ O! |* L$ @! O& E
  }$ V. @0 K% W. ^* v
}4 D( L5 n% G: N# Y4 ~
, m+ J! U3 d1 G( a! O
* S+ ^: D9 Z5 R* c- f- T! m3 T# Y  d
【 NO.3 找到指定长度的回文数】. z, \' i2 v7 `) X

) I- ^9 g/ X3 R  e' t# R) L* e解题思路. j2 n% y6 [- }, N' c* {: h% Y
举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。# V2 ~. Y0 x) r& z6 r6 d4 ^

7 x/ [" I* {' C& f. @奇数长度的回文数在复制出后半边前去掉末尾数即可。
& ~3 q5 C" _" U5 ^8 v2 {1 G9 V3 B( v
代码展示
- `1 b$ c+ I1 B
2 B) o6 J( p4 n7 Y# |3 Y9 Sclass Solution {
9 b2 {$ a- [" L   public long[] kthPalindrome(int[] queries, int intLength) {1 J. q/ Y3 C! T" h" y& @
       long[] res = new long[queries.length];  t# w/ Y3 S+ e0 Y; A
       for (int i = 0; i < queries.length; i++) {
$ p0 [! h+ m( @+ F# r$ [/ U           res[i] = kthPalindrome(intLength, queries[i]);
9 R, B+ o* u1 Y  B      }
" k  Z7 H; z$ W6 K% T       return res;( H3 C, i5 y7 @* Z
  }7 \: z, P7 h1 |

) f7 ~3 ?* }/ s3 p   // 返回长度为 intLength 的第 k 小的回文数$ i6 t( v: l$ X5 A& ~
   private long kthPalindrome(int intLength, int k) {
1 N: p4 B) I0 A# `) F' V       // 处理偶数
) k# |7 H. ~; Y4 m* e7 `1 W3 Y; ]       if (intLength % 2 == 0) {
; ]4 X1 r; p  e. q) Y           long half = pow10(intLength / 2 - 1) + k - 1;
. K; ]) n" ^' L$ o           if (length(half) * 2 > intLength) {
( B) A# n/ \6 ~" f# x               return -1;! X4 H% y! I  w2 C9 _' s# o& {" ]% E  B
          }0 Y9 x* M0 m3 h# @0 @6 [
           long res = half;
# f- w7 E- l# V' U           while (half > 0) {
( l! c) D5 r& I2 v1 V0 Y* p               res = res * 10 + (half % 10);- a( `, [; E5 A, [$ ?: d; K; c
               half /= 10;
1 {& T* V& b/ t. g2 f7 K# x' m          }3 X' d3 Y4 P3 F- y& C7 T5 I9 o
           return res;$ t8 k, `: C& \. T! v
      }
" `8 T3 A8 [2 S/ ^+ M! m( s+ q6 j
       if (intLength == 1) {6 f. F: H( n& p2 r: n4 c% L2 I7 n
           return k > 9 ? -1 : k;) [* X; g, _+ v  s8 B
      }
. _, j: o" a- O; A0 d/ n9 O  c* ]8 E$ Y, D
       // 处理奇数
) m* s. L3 N% x0 l: K" l       long half = pow10(intLength / 2) + k - 1;
+ ^& \3 U1 I$ T& h; ~       if (length(half) * 2 - 1 > intLength) {# X. V3 _/ X/ T  ~
           return -1;- J" T% d2 [" u
      }
1 ^# c* u; A0 l7 N0 H8 a! m% ~4 H       long res = half;
5 H6 d5 L4 R: D# Q8 Q       half /= 10; // 去掉末尾数' H- t0 J: r' }$ v3 y
       while (half > 0) {
1 m) L& d: o8 J; t& a# S           res = res * 10 + (half % 10);
/ J0 F  [& N* I4 @9 G$ E           half /= 10;. F6 X' A: x) t" A# f3 S, `6 c; w
      }
/ r- A6 f9 Z: m) M0 M( Y) W       return res;
" q$ v7 ?2 [9 s/ p  }
% R( N+ h' _7 L8 J3 Y1 u" M" t( ^
   private int length(long n) {
/ p7 J- n" s1 [+ X       int res = 0;2 O1 ]1 M5 @: h0 G9 y% h0 O  I! k& y( P
       while (n > 0) {
1 ?) a6 T' ?# r; j; I9 N! k           n /= 10;+ P4 s. E% j0 |7 T* Y
           res++;
/ |6 B, Y) z: V# Y      }, u# k: I  c* t; E/ |& g$ y$ l
       return res;
4 i2 y* N6 r8 p+ ]  }1 _/ P4 W- [8 V4 K( X. k" n* T; v
9 e# f( d, `: e7 M
   private long pow10(int n) {' j8 N, H% }' W* M: p# L
       long res = 1;
2 V( K! B: V6 i6 I& m  ^# C: C       for (int i = 0; i < n; i++) {) l; u3 W- |% I& g# _# O, o
           res *= 10;
% G6 f9 g- N, C      }8 s; p* p/ e; |0 w9 x9 ?
       return res;
" p1 K4 z+ U$ t8 V  }
- M, u" q1 l" }, O7 |4 n}4 I+ F8 s7 T% U' C( m
; |' o0 g! D; D6 m5 |9 [
1 d; P0 `. ~' ^# j. \+ J7 T  |
【 NO.4 从栈中取出 K 个硬币的最大面值和】& ]( b0 |7 ~& R- ?/ l% t: A
( N" U$ p% h) k7 P5 L
解题思路2 h) F4 y5 z9 W# @0 H( R
典型的动态规划问题。
; s8 b0 u" I- E' U$ L/ Q$ l1 d2 T8 _( P* U
定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。
" \0 @9 s' [7 U& O! K3 o1 q: a. b# D- m  b2 y
状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。) n# \% d8 n+ C5 m2 l. i  X+ g
1 D+ K$ c# L9 x
代码展示/ C  o. I3 {$ X: c* T7 f

/ N+ h2 m+ a1 j0 \# Wclass Solution {1 V6 x$ Z; b/ g6 k. L
   public int maxValueOfCoins(List<List<Integer>> piles, int k) {0 O  h/ ^: B# m8 r  A* R, z& S9 M
       int[][] dp = new int[1001][2001];- g: N/ E% W# j" ?$ Z& |( R7 r
       for (int j = 1; j <= k; j++) {: _/ ?$ w9 ~4 ^( p$ B
           for (int i = 1; i <= piles.size(); i++) {
% z4 M( S' R' f6 G               var p = piles.get(i - 1);! E" m/ r8 j' S" y: Q1 i- ], r
               int sum = 0;8 i1 `& e! b( C; r6 F% f7 \" I
               for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个6 G+ A& v0 n/ a( E' j; K+ n
                   dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);# T) \" o8 m$ n1 b; r# C$ I4 m
                   if (t < p.size()) {
; A' q2 N7 t& }' C6 c, @                       sum += p.get(t);
& V3 p4 a$ S, b0 D2 z4 y                  }$ ]/ D4 c2 b1 A! I: x

! G' Y8 P# h  W  e' c  P. l% `              }/ x9 |8 L, F3 E& R; }9 W
          }
! E& ?, @7 d0 ~+ P( T) n      }
: N- o. I) O7 M2 a       return dp[piles.size()][k];' i0 A# @6 t; r
  }1 y; W" r' n  Z" N, i+ ~1 G
}* a- R# H4 V7 ]% o3 S
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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