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