登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】
! P; l ^3 i3 p. B: F0 b; y4 o$ Q% m$ R: ?( L
解题思路
/ {4 p8 Z( ~4 I: A5 T3 N1 I签到题,枚举即可。
" E4 }: w4 y& r. }5 }% N+ v% D, W
代码展示
0 l. ?, E8 a; P3 `
4 [$ H+ h$ `0 g8 {class Solution {
- _. D, S% T; g public int prefixCount(String[] words, String pref) {
8 G3 `% { c, d, T6 _& M) E ~ int count = 0;" }1 s P/ {' c, N( z
for (String word : words) {- s/ d/ P* D6 `+ q
if (word.indexOf(pref) == 0) {. E# |& h2 m4 a8 X: [5 g
count++;
$ t2 p$ N* ~* h }+ T( J# h- B; [) w; T
}
) w" A, H$ L* s+ X# }) b return count;" @6 p; O \6 ?. [* h1 }6 l
}
+ V6 m6 P, |* d: ]# S}
) b# Y: X" _& o7 ~8 _/ I6 Z+ N+ L& J2 \
9 z6 K- Q6 P U4 n( {0 l* D
【 NO.2 使两字符串互为字母异位词的最少步骤数】' ]* v& ~# F" ~, u: p1 ]
( @4 j/ h! j; C, _. c! L# {9 x& J# b
解题思路
& j2 V: I5 |! C8 z4 i1 `6 G字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
/ G: n) y% H! o* f8 e- A" h8 i
+ c- |, C% X. q S) Q4 T% q代码展示
! ?! h# V$ B/ v: m) j/ Eclass Solution {
+ ^4 D7 D; u3 l* t' I public int minSteps(String s, String t) {
* U! G) Y5 I6 G int[] countS = countLetters(s); {5 D/ K: [& ]1 M' R3 N. L1 G0 n
int[] countT = countLetters(t);
: A8 X( @# p O: i int result = 0;
) |- ?$ d6 Q$ ?/ v* A& o for (int i = 0; i < 26; i++) {
7 i/ L$ M/ M) \1 \ result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
" p- _ m6 r3 y( \; w8 D0 w5 r }
" C+ [+ p0 Z6 ] return result;
; x- e" P- |& z }
( S j% V2 @7 l& A
3 Y: d4 L7 n0 n9 K private int[] countLetters(String s) {
+ M6 R: i [, B Y9 t& [ int[] count = new int[26];3 I/ g2 d0 e) R; b0 f5 q4 f. F/ G! k
for (int i = 0; i < s.length(); i++) {
" h8 S# S0 K" u( R* i. k) j( S count[s.charAt(i) - 'a']++;
/ g$ y4 J2 Y" ^$ U+ c' f1 l }
5 ^. w7 `$ B9 A- D8 B2 ?7 \ return count;) P5 s& G f. a; d- V# f
}
; [2 a. g& s. u}! k( h( @7 `) r; l! L0 C
6 O- X$ k/ W. Y* J, q! X! j7 v3 `1 c8 F% k8 l4 o& J9 _( d
【 NO.3 完成旅途的最少时间】2 B2 U9 Z; w1 f" G% i
, b" I* h! S7 b/ ]' ` _9 q
解题思路* V& Q @ D9 m9 l5 N; `0 ^
典型的二分答案题目。$ v# P8 H& X& G# `, T0 d
! j0 |, Q! G+ t代码展示
) ~! |9 x; K, f, Xclass Solution {
' R2 L+ C2 s1 ~1 k# ? public long minimumTime(int[] time, int totalTrips) {
6 B% G! z* X* N2 ~' ^ long left = 0, right = (long) 1e14;: N; W/ h" E; \4 i' C: G
while (left + 1 < right) {9 P# @" ~' A9 _; V
long mid = (left + right) / 2;5 ~3 y C0 s8 f( ?
if (check(mid, time, totalTrips)) {0 y0 J% Y0 c: O9 M1 ?9 r5 b
right = mid;+ [' u l2 J* s- r% P
} else {, x/ q# f7 K- k0 V
left = mid;# Y! i8 `" j0 J( r/ w" A$ @
}
5 ~* B( l) O! c }
3 |. F# q y, h9 m return check(left, time, totalTrips) ? left : right;6 v5 L" ]# t" }: T6 l% _( _
} ]* A; u$ h5 S
& E+ k; L5 K2 Y: h private boolean check(long limit, int[] time, long totalTrips) {
! j* `) S+ ^! t* g$ B9 f) S for (int t : time) {: T* k) _# T! Q7 ^& U4 |
totalTrips -= limit / t;9 [0 J. c3 t1 r0 P& H: Y+ X" y
} U6 n3 j& I, M% y6 ?
return totalTrips <= 0;
( f- U% K: e9 d1 w F% ]6 | }8 @' t% g1 e" w/ G- _
}$ o. T2 V4 B6 w' W3 z5 z9 [
, }7 E) s$ y" ?6 Z0 _0 h. `# s【 NO.4 完成比赛的最少时间】
4 T2 L3 b$ O0 K
3 b: d1 U0 _+ m解题思路
) y4 u) R) @ u7 j% ?/ D$ Q动态规划问题。/ C7 H& V1 D+ h9 {' S7 `- q
& R0 |. q! N( i: w先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
* N! K( M' d+ O6 j$ V$ I. ]# E% p, c2 p8 G& s) s
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }8 c& ]" l- I/ m
+ E$ ?( u! d: h2 y0 w7 J# f
注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
: Y1 u j4 k4 Q7 q6 j& Q
( k6 Z7 o+ x3 Q* `1 k由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
: W) o3 C) z9 Z( L
, r4 I6 h \* g5 D {6 m- q代码展示
; k% x/ d1 ~) }9 L- t+ pclass Solution {
3 g/ l. }5 s. r' t% B! ~ public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
4 R% x, J" Z8 M8 I8 V // g[i] 表示不换轮胎完成 i 圈的最短时间
. X/ I9 J. `$ l; M' S$ O, Y* x long[] g = new long[numLaps + 1];0 f# j# b/ G* {$ H3 _. k
Arrays.fill(g, Long.MAX_VALUE);" u' M8 b7 h0 E9 q" y# Q
for (int[] t : tires) {1 T+ K0 M+ h3 L7 S* k" z1 y" f/ R
long pn = 1, sum = t[0];* q4 K6 I9 D5 n: x
for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {0 @" \5 I! N8 s
g[i] = Math.min(g[i], sum);( A4 f+ }7 I! P7 J" r% [: n. N
pn *= t[1];$ w" u4 I' y% e- [; u
sum += t[0] * pn;) W. Q2 l# S3 @( J
}
K l3 r7 l) q# i6 m( K; M }% `6 W$ `8 `8 Q( X& {- i
: N' w3 l* q6 }' K& V } // f[i] 表示完成 i 圈的最短时间
& q0 j3 e+ H: _ long[] f = new long[numLaps + 1];4 s; x/ T' u! g& K4 e4 C" f
Arrays.fill(f, Integer.MAX_VALUE);7 o) b0 l$ @- s4 @9 ]
f[0] = 0;3 ~- k" Z2 ^) j
for (int i = 1; i <= numLaps; i++) {
/ r- E2 Q( U9 l$ I& a9 } for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {- N6 f% z% K- A4 v/ t
f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
6 E, G1 W8 x3 S- k }
3 D& O5 f* Z! S3 Y }
) `9 k! t' q6 B# {" q( m) ^ return (int) (f[numLaps] - changeTime);
7 }! c# h* u# i' p }, E4 R. N) W& X% K' o. C
}0 o4 i) K7 x6 b7 U. r; r
|