登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出两数组的不同】- l: w% S% x; M9 |9 {
4 o# Y! N& q- g* t7 p: h" B w解题思路
3 K; D) H6 O# }2 W' W可以使用 sort + binary search 求差集。; a" R% ]) D, \) e9 J0 D
# x1 ~1 y7 N: V代码展示4 H$ o) r& s: x. t
. _; }4 W, J- s3 r* j
class Solution {9 |! _5 a$ e( z8 @7 W
public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
1 w9 o5 C1 e, S Y. h& g+ X6 @# D! `7 ]8 b Arrays.sort(nums1);: f7 v' S j: ^ L7 j
Arrays.sort(nums2);+ q' ~/ T% w, j
List<Integer> res0 = Arrays.stream(nums1).1 X3 A. V: o! T/ W
filter(i -> Arrays.binarySearch(nums2, i) < 0).
# y0 R1 w" w. G* C4 A5 [ distinct().boxed().collect(Collectors.toList());
8 ~2 a! M) M4 X2 p9 C: P List<Integer> res1 = Arrays.stream(nums2).
8 v: B$ @. m$ m) _ filter(i -> Arrays.binarySearch(nums1, i) < 0).
0 N7 A- a. n8 M distinct().boxed().collect(Collectors.toList());7 a: m& M+ \: }
return List.of(res0, res1);
# Q" I, B$ r1 k; A& ]" M }
3 K2 Q) m7 J0 s2 O9 l8 _}6 M/ A+ Y. C5 h) J
4 I# H% W7 e& x1 ]
+ U! Y5 \( a% J【 NO.2 美化数组的最少删除数】
% G4 p, f& {* n6 _" ^$ ~; P- q. T
3 Y3 @6 r# a" M4 W解题思路7 C( L2 b" z9 v) O
从左到右遍历即可。7 r/ x0 I; @( q( g: ]+ D4 s
6 {- V: Y& e* f; a( |
代码展示
. n8 k, M6 R v0 Y4 n
8 x& Q2 W% p! T! R2 G0 H0 v7 y2 iclass Solution {
, t0 q! c; F. k public int minDeletion(int[] nums) {* R* P6 o3 z5 ~' ?$ e8 `, u7 r' @
int res = 0;
" l. |. M; l. g* ~/ A+ W1 [ for (int i = 0; i < nums.length; ) { // i 应当和 i + 1 不同! | u5 V) m4 O
if (i == nums.length - 1) { // i 是最后一个,应当删除
- I* e/ Q( l; b0 G5 G) G res++;' x) L, s( T. I; s8 j7 } n8 D
break;. J* ^% ?$ N" F, N: L! E7 `
}
% N/ c& y6 x& G. G, m8 L if (nums[i] == nums[i + 1]) { // i 和 i + 1 相同,应当删除,相当于 i++1 ]% ]: y5 K( W6 L- L8 `$ I- x
i++;
) m) k/ h; C2 W. h6 G+ P res++;
6 Z2 t; q# ]7 e& O3 e9 Q3 B } else { // i 和 i + 1 不同,可以保留,i += 2 以判断下一组
/ G8 C+ J! t& K i += 2;
& p* Y- S$ ^% x9 \: |: d: s. y }
) X0 D7 {$ M' i+ d4 _7 \) k }
3 g. t6 d, W- e9 M return res;! y$ \3 e" J, j
}7 I4 w1 A. j' ^
}
( r! v% r- G& K# V+ @$ h$ u$ `1 S8 g6 m
$ a& e, q9 t3 R$ d& s5 {
【 NO.3 找到指定长度的回文数】+ M. ~, e8 r C+ v$ Q
0 L( ~- Z/ w+ J, o+ Z3 S7 }解题思路
3 N$ s6 |6 ]2 u! x; w举个例子:长度为 6 的第 k 大的回文数的前半边其实就是 100 + k - 1,由前半边复制出后半边即可。
3 M' K9 M2 r# o8 D3 I
3 W( o7 h. B8 E0 }; [奇数长度的回文数在复制出后半边前去掉末尾数即可。
& a& [) s3 d; e9 C0 e
$ B) }# K' J( |$ G8 G; l9 S+ X6 N代码展示
: c1 O9 b) e( Y; K( P
5 n& h, S+ o7 h# rclass Solution {; `' S' |% f3 E( u% @4 F- U
public long[] kthPalindrome(int[] queries, int intLength) {
, D) }7 g' u P, D* t& J$ ] long[] res = new long[queries.length];
0 m# D) e2 q! r2 H5 Z6 o for (int i = 0; i < queries.length; i++) {
) c6 L7 d9 Y; K' M9 j. u$ g res[i] = kthPalindrome(intLength, queries[i]);' T3 x- E Q5 e' I" L7 Y$ B
}
# X: x. I; U# G2 j return res;
$ |1 G1 L! I, o }
/ C/ ^# m0 A1 a* M
) }* v4 X) l% s- f: T0 Y // 返回长度为 intLength 的第 k 小的回文数
: L, R( ^5 f0 m) y/ ?+ ]5 v private long kthPalindrome(int intLength, int k) {
( L* b8 Z l( p! @ // 处理偶数' J# a, N- o! U
if (intLength % 2 == 0) {5 l" ^( X! f& k( Z" A! E
long half = pow10(intLength / 2 - 1) + k - 1;
' d1 ]1 q: r* R/ T if (length(half) * 2 > intLength) {7 l2 T, N" y7 Z$ K# G
return -1;
. ]2 w' w) `# k' u1 f! P }
( b; p7 P0 z) C! B. l: Q& F long res = half;
1 P6 q1 E0 l2 S3 ]" q1 m/ o& J while (half > 0) {& x) X% m6 ^ l
res = res * 10 + (half % 10);; h6 t! Y7 E" E* Q
half /= 10;/ w7 K2 _* c; b9 y" ^
}
/ f+ K% u1 O/ ]+ L* H return res;
. q: ?4 p" g6 I J5 _3 \/ b$ s }# y A8 @4 m7 f( W8 L
* f1 D0 [* \& W if (intLength == 1) {
6 U, E0 v4 T2 e3 Q return k > 9 ? -1 : k;' f( c& \. e$ k) r- H; v9 x! v/ g
}( c# h. _2 u) Q$ |: d$ L
! A2 c% @5 A' [9 N6 k // 处理奇数
3 g0 [% v' Q6 {3 g long half = pow10(intLength / 2) + k - 1;& a1 ]% Y+ d3 P" E3 `
if (length(half) * 2 - 1 > intLength) {# {0 P* k$ o, o. s6 M7 D4 f% k; N
return -1;
& U y$ }; f3 d( ~$ k }+ G: F |" f# }' W, T$ g0 K
long res = half;
/ e, i6 C3 w) P% F7 s half /= 10; // 去掉末尾数$ y/ K$ r$ j m7 D7 P
while (half > 0) {
& c. a( P% {/ f* D$ k) p% X res = res * 10 + (half % 10);
, T# E/ T- h9 q$ i0 E half /= 10;
& g, |" ?; [: O: m6 t j9 d }
8 ^1 G' J0 i, r0 q( x) S8 h return res;# U, i& }9 r# a; r
}- U- [0 h' X3 w! M; W8 H2 i9 Z$ J
Y" q+ ^, r2 [5 R- }* V+ R0 K
private int length(long n) {1 `, F# J. d {' P
int res = 0;: a& _' D7 P3 M
while (n > 0) {2 x+ N* c3 c! _9 g0 s+ q6 h
n /= 10;5 `4 ?- ]. p9 k
res++;
5 n& @ E2 Z) |' }1 R! H! q1 [/ ^7 L }2 h0 {! V7 a- ?, r0 q
return res;
$ t( J, t9 b& g }1 U1 v. d! o6 j
2 A4 {6 i5 X, A" k* V2 |0 F
private long pow10(int n) {
0 @% n2 o; ~0 U+ O- Y long res = 1;
$ {2 ]4 e/ p% N9 j. H# u2 p for (int i = 0; i < n; i++) {; U5 D- r7 x2 p" E* f7 P
res *= 10;6 x) `1 K% ? ^5 t, _, j
}( m1 o& s' c$ ~" r1 p! D, {' }
return res;3 P* t s8 A# L ~
}8 ? @6 P( U- l6 ]$ `) \( P, h9 `8 A# ~
}
" Z- r' L* ?4 ~ U% r" h$ {0 O9 q% J+ {; t4 z! C& r$ T+ f c
+ } P- O! |* v5 [5 `% [+ L( X/ S【 NO.4 从栈中取出 K 个硬币的最大面值和】
`( _7 |0 M e8 b0 h
$ Q2 I8 W2 q7 o o解题思路
7 `/ }2 f9 t8 _/ [/ M V$ T; j- M, y+ T) {典型的动态规划问题。5 ?# [6 ?& s$ t) a" w1 O1 \! \+ m
$ J' Y/ M; U4 b V. v定义状态:dp[i][j] 表示前 i 个栈取 j 次得到的最大和。
5 I8 r+ Q7 e T1 h, n. s' A3 I U6 k9 `$ d' U8 a! P
状态转移:在第 i 个栈取几个,即 dp[i][j] = max{dp[i-1][j-t] + sum(i, t)},其中 sum(i, t) 表示在第 i 个栈取 t 个硬币得到的和。
- A7 x7 Y9 ^( R7 r- w! H p
( ?- C2 p8 @9 [3 D' I+ ~* P6 T代码展示
: O8 ^$ k# `/ M5 R" H0 q+ G' u2 @# L8 f9 ~' G7 k3 X
class Solution {
, K8 Q3 d, v0 B0 i public int maxValueOfCoins(List<List<Integer>> piles, int k) {; E B/ O# f1 u% n6 q& `
int[][] dp = new int[1001][2001];6 S0 D, Z: k2 M$ E/ s# g2 v6 \
for (int j = 1; j <= k; j++) {
& s5 W6 M5 y6 V3 |; E for (int i = 1; i <= piles.size(); i++) {7 ~& C) ~- o: k% i; s0 u, r- u
var p = piles.get(i - 1);
7 z1 k) ^0 t8 [% x* M! r int sum = 0;" h( y2 x( c' N/ C
for (int t = 0; t <= j && t <= p.size(); t++) { // 枚举在 i 取 t 个, x. W/ u/ j) h# d* C
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - t] + sum);
4 w8 s& A6 `6 K6 @2 E0 J if (t < p.size()) {3 F5 p3 {2 _' u9 k l+ k# O
sum += p.get(t);# L. @6 j! G3 V9 ^
}
- ?" ~. Y7 ^! E: b% W2 q5 _8 C c" b% e/ p7 W* i2 [
}
6 N0 v' {$ b/ l6 l' X1 e }# b. y9 ^" |2 q' W
}$ Z( F3 a( Y8 }. {; }5 e
return dp[piles.size()][k];) L' M9 A8 ?% V0 k \
}
E4 O% Y# y# r" j3 n# f' r. y1 F}0 \( e5 T9 {" n' N1 I) w+ ?
|