登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 按奇偶性交换后的最大数字】
, |% o4 X- @( w
0 g" T& l8 q( r8 A解题思路7 G3 M, Z( @: p( G. f) @
分别提取奇数和偶数,排序后按照奇偶性顺序还原即可。, c8 f2 @( n, u
8 x/ L" G' P m3 Z- W
代码展示
0 t# d9 U$ B3 ]. E! [& e1 _" P2 U3 ^5 ?" G9 e1 j8 k% |5 |
class Solution {& h* P* o) O. l& K( r: D e
public int largestInteger(int num) {3 B" Z8 |7 E% }* I& x
List<Integer> type = new ArrayList<>();
* w" c$ O) W L& w0 u List<Integer> odd = new ArrayList<>();2 |* [$ N F. _0 Y4 x1 N9 V O
List<Integer> even = new ArrayList<>();
4 n6 \2 S1 J4 _- G for (int n = num; n > 0; n /= 10) {9 M" C: y9 q1 G& ~; A- ]1 v
int d = n % 10;, ]! g2 a; _: r2 B5 D& }
if (d % 2 == 0) {
* e7 D6 Q* ~( ?# g: k+ `1 g type.add(0);
- C5 t( W+ S/ J" t% s even.add(d);
% V; |/ Q; ?! Y, u' F } else {0 S) N) C- E$ M' ~, M" s) R+ ~, d% F
type.add(1);9 g- M0 e2 S) @! \( D0 T$ T; v; [4 C
odd.add(d);
6 O0 }* S" s0 B }
. }, A6 m2 [8 O+ R# V }
1 u- K* x1 S' i$ m/ Z; z odd.sort(Collections.reverseOrder());
) u% e( m$ J5 U even.sort(Collections.reverseOrder());/ d9 |$ i+ _! T+ |
int res = 0;7 O+ S2 I( T# p
for (int i = type.size() - 1; i >= 0; i--) {/ V- B& Y& a* ^2 f; ~7 E
List<Integer> list = type.get(i) == 0 ? even : odd;
" a8 e, {+ E+ j% q. r4 z res = res * 10 + list.get(0);
1 R$ R5 @/ h. C1 p list.remove(0);
7 k& U9 C2 m' L/ F }
! E* X5 b# S0 |. G return res;& p0 S( S! Q# z7 h
}+ _3 W: ?9 p2 _3 `& s
}
1 q) g7 ]: e: ^$ Z
8 q$ K8 d# s% e; z+ a* e, w. r5 O- M; t$ d; W* l/ q
【 NO.2 向表达式添加括号后的最小结果】# t+ M; [2 ~' U. J
! }# }* t" r3 C9 _" r* _解题思路% p/ t9 D( {# z* _! h. L
枚举左右括号插入位置即可。
7 _# ^7 E1 C0 \1 |$ f H. |- X$ g! n
代码展示
$ @) \. U& q: r( {
. Q: e. }: p1 o$ z* m9 N% Y0 Aclass Solution {0 b, D( t4 m/ C/ O5 t) }6 P
public String minimizeResult(String expression) {) Z( K& y# A# l
var elems = expression.split("\\+");
2 i9 t( P- u5 l& q" {7 r long min = Long.MAX_VALUE;
/ a |9 S0 z+ ~8 H6 e String res = "";) m. M4 _9 ^/ Z/ i' h
for (int i = 1; i <= elems[0].length(); i++) {
3 D- V$ V( R% A4 } o2 `, G for (int j = 1; j <= elems[1].length(); j++) {
& o, w( I/ J- e4 i0 o+ _ long left = i == elems[0].length() ? 1 : Long.parseLong(elems[0].substring(0, elems[0].length() - i));
. b& O" ^1 \, [* Z long add1 = Long.parseLong(elems[0].substring(elems[0].length() - i));) I/ e& S2 E/ k4 F5 L/ Z
long add2 = Long.parseLong(elems[1].substring(0, j));
4 Y% b2 a+ O) ?( x2 q long right = j == elems[1].length() ? 1 : Long.parseLong(elems[1].substring(j));
+ a5 K8 s0 T8 U" P T& @ long sum = left * right * (add1 + add2);
& p1 S& U; Q- p2 k0 _: M if (sum >= min) {
4 k! m' M( E8 N, a) B3 u continue;
. g6 r* l) w9 T9 m3 o# S }1 x& Z8 q- e6 h2 o7 I
min = sum;) _8 @. z& B2 `0 K h. A
res = i == elems[0].length() ? "" : elems[0].substring(0, elems[0].length() - i);
7 \/ f2 ]7 o! _) O x res += "(";
7 b. Z( v8 B0 a0 X$ p res += elems[0].substring(elems[0].length() - i);7 A p6 O. I! e/ r9 w, o% \3 G; x
res += "+";
& B$ }9 y" g/ O7 h res += elems[1].substring(0, j);8 r, |1 a+ A3 d/ S; D4 ^6 X* A
res += ")";/ q" t2 p# _" c
res += j == elems[1].length() ? "" : elems[1].substring(j);
% [6 H! p v% ~7 K, Q }% @ P( C" y: l, A6 _2 f
}
. w3 a& a# R6 J7 [, g) i return res;, K; a$ P4 Y4 R/ |9 P
}8 _/ {/ l; O M: B! Y0 G
}1 s* X- R& S* b; U7 _
, |) x1 |; E5 i8 j* H, l
* R1 t& w% w( M, S" o1 V( e【 NO.3 K 次增加后的最大乘积】4 i) x. f7 ~7 h' n' y9 i
" O. B) C1 _0 h8 S" J解题思路
2 a' u) O, \6 F& t" R每次将最小的数字加 1 即可。# O8 x; C4 }$ g- i/ B j$ H
0 A2 V* [) D- n5 ]) }代码展示
2 h) \8 `6 `- K: e) ~$ [% o% \7 f- U0 Q) g
class Solution {; q! G5 Z& L0 W0 Z4 \/ i
public int maximumProduct(int[] nums, int k) {
8 v; T6 s C8 j3 _, s: a1 k% o PriorityQueue<Integer> heap = new PriorityQueue<>();
( o+ i, v& F2 Q7 M for (int num : nums) {
g4 H- F, l; D+ t& x9 z" Y heap.add(num);! a( ^1 s; o; E) I3 i6 T
}% f+ ~$ Q- H1 ` w2 U6 t+ ~
for (int i = 0; i < k; i++) {, C; m# ~, l7 N
heap.add(heap.poll() + 1);
' S7 a* m' o7 w7 R, c7 s( J$ J- H }9 r' Z3 W# n: l2 l$ R+ c5 R
long res = 1;
$ a9 p$ U1 X, X! } while (!heap.isEmpty()) {8 H1 I/ b2 ?4 v' X
res = (res * heap.poll()) % 1000000007;
' C" ]# [ l# g" Z5 d }4 K2 c% V( u7 e U
return (int) res;( l; K* F. ^* u- J1 g. l
}' N6 w8 O, Z, I
}
9 K& s) _& c5 q2 b" H! E3 [( n8 A: s" |
4 v2 T. O8 ~$ K【 NO.4 花园的最大总美丽值】
/ a; s" h2 J% `3 T I. A9 t5 @9 _) r5 n& N
解题思路
3 k1 y1 b. g( n5 b两根指针。
! f6 |9 y! i5 l, t+ q' G; c" L5 e
将花园排序,最优结果一定是令 [0, l] 的花园中花的数目都达到 x (x < target), 并且令 [r, n) 的花园中花的数目都达到 target
4 }7 Q& T/ K) r1 A% G" c: h8 ~" A, I. `" h. N
此时的美丽值即 x * partial + (n - r) * full7 V) N$ m8 W2 `2 n
; e, m& J/ |5 n( n
枚举 r 即可,l 随着 r 单调递增。- B4 P. q2 b/ Z4 G4 D
+ x. ]" P% o/ S: v' }% j- S
代码展示
: b' s4 H: q& Y- |; O
4 r4 e+ |3 K8 L! r; G2 t1 Jclass Solution {& c/ z! S9 ?+ A0 j' B
public long maximumBeauty(int[] flowers, long newFlowers, int target, int full, int partial) {+ P& v0 H5 l7 e; P
Arrays.sort(flowers);
) f% |2 V, @9 k& ~ long[] presum = new long[flowers.length];
2 W0 C J1 o& B: O# g presum[0] = flowers[0];2 i% k" Y H" z5 I. i
for (int i = 1; i < presum.length; i++) {8 d/ y! S! W* i- C9 c
presum[i] = presum[i - 1] + flowers[i];( @! h1 f* X) k' M% j
}1 L8 m# {% f, [
5 F0 b) j6 h/ g& Q long[] toTarget = new long[flowers.length + 1]; // toTarget[i] 表示将 [i, n) 的花园变成完善的需要多少朵花4 t9 S0 p; o, g G' \. I$ E! X; Y
for (int i = flowers.length - 1; i >= 0; i--) {: |) }' W% s$ R& B* \* `
toTarget[i] = Math.max(0, target - flowers[i]);
9 c! `/ s% Y% @; ?+ F6 ^% p }% i' y6 @, h; J
for (int i = flowers.length - 2; i >= 0; i--) {
# S% h# }! M2 Y toTarget[i] += toTarget[i + 1];9 {( y/ l2 Y- h$ d" ^; L( u6 j! O8 A
}
- W" R9 v) X: X; \. r5 c
- d5 i6 m0 U& h0 l5 V5 z: \ long res = 0;( [4 L- ?$ C' H) b
for (int f = 0, p = -1; f <= flowers.length; f++) {
( S1 I: A+ B, X9 F if (f < flowers.length && newFlowers < toTarget[f]) {
5 s) m# G, X0 [ continue;* M& W& e( u' l0 i4 e
}1 ^1 `3 V$ o1 u' H, l R
long left = newFlowers - toTarget[f];8 U3 Q' _: v1 w3 x; R# y0 Q
while (p + 1 < f && flowers[p + 1] < target && (long) flowers[p + 1] * (p + 2) - presum[p + 1] <= left) {
5 X; I; y$ v' p# K1 Q" d5 } s p++;
1 a& k. J: H8 U6 \0 n7 z }
8 L/ R6 u7 K) d* N8 M: { if (p == -1) {8 {4 C6 m9 q: z
res = Math.max(res, (long) (flowers.length - f) * full);
' k, Q7 v* y, f0 y6 [) w1 Y) ?* h continue;
; n. D( w! C$ L+ C( X- ^8 D0 R C) ] }6 n5 s, a+ A: ]0 z
left -= (long) flowers[p] * (p + 1) - presum[p];7 s8 H+ n3 P3 F, \
long min = Math.min(target - 1, flowers[p] + left / (p + 1));
2 @: r$ T( M- u2 v9 u& ?5 g9 s res = Math.max(res, (long) (flowers.length - f) * full + partial * min);, W* L' C9 {0 a* D4 m8 I
}
, K, K" @& n7 g/ @# v0 a/ Y) ?+ U2 V; \ return res;
! V1 F; w2 s0 N4 i: c0 X8 |8 \8 O }% {0 x! q5 X' R- x$ i& w
} |