登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
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$ ^
|