登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】
* o; i' M$ O' B) e' x- t. r7 ^8 W0 b! K) k- F! g
解题思路
" F+ X+ p( Q. V签到题,枚举即可。1 C! h; l# y. B& |8 P
; ^6 H% h9 O! n* j5 R2 h& B
代码展示9 P" V3 P, Y; g0 q# W
3 p- l1 B$ y% s! S. @' [3 k
class Solution {
9 s; l/ R: Q7 P" B% m, Z public int prefixCount(String[] words, String pref) {
6 `5 `& E" D9 w0 j3 E( j' \" e int count = 0;( y$ } ] j/ M) j
for (String word : words) {
8 y1 ?+ ^ f# f, K% m if (word.indexOf(pref) == 0) {
1 y4 z' U5 a) w count++;
& A9 m* W) J5 e. c: E }7 I( D4 N+ n) |1 N: q* R5 C, m
}
; m1 w1 L9 n0 m! o return count;
9 ~, h+ Q, ~4 n. }' F: l3 s" L }- Q M1 J g, h# `) h0 {1 T* z, e
}1 U" T1 }0 D4 ?/ z, X
$ C9 h1 s7 |6 n) k' | y% t5 x! N2 c$ A% }
【 NO.2 使两字符串互为字母异位词的最少步骤数】% [% S7 Z5 ^# b5 s4 P) t
% w) `# K+ p9 D$ O$ Z解题思路
* F2 R2 X" v' w8 j2 `9 U字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
( ]/ g, O' R' M8 `% R2 U. `. |4 t; `, f N2 L7 y% e, E
代码展示( M7 {* ]0 n/ S/ v& `' Z( X
class Solution {+ ~0 R8 d N9 V% L
public int minSteps(String s, String t) {; ^( i( L) R. W5 \( `
int[] countS = countLetters(s);% @3 n7 z0 E8 k
int[] countT = countLetters(t);' [/ ]. f1 p, |! B" M* f
int result = 0;
9 K+ `# Y6 b1 ~5 T$ b+ d for (int i = 0; i < 26; i++) {5 b" e U7 z, y
result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);' N6 p7 N) E; u8 T- l8 l7 J
}- r4 A: K0 E# b* e! P
return result;7 ]1 E$ M3 x; ?& @
}
. p; {- O; p4 v# e- ^( P/ ~ M1 A9 V( D) y' b8 u2 q
private int[] countLetters(String s) {
; k U- o$ U2 G7 t int[] count = new int[26];
n6 u7 R3 @& c% z for (int i = 0; i < s.length(); i++) {
' y; h& Y9 o x count[s.charAt(i) - 'a']++;
H4 s+ l/ {& }2 { }; y1 J. B# B- O+ t) J$ X( M
return count;
0 Z. b* \# z' C- H: x- t }( p" a" |! n3 t" X& J: V
}
3 H1 Z; o" x; z% K; E. J) J% m( [1 j
0 a8 F4 |( q0 i【 NO.3 完成旅途的最少时间】( K' I( q- @: O8 N+ f
( i4 g) m; q7 b7 d$ b
解题思路% g2 g. D" r/ z u) S X$ @& Z
典型的二分答案题目。
! o; u" P6 {+ J, R5 @+ \" ~% _& S: S0 m# N+ i* E
代码展示
1 G4 z9 F& V. O! _class Solution {
5 u2 ~/ _+ H; U7 ~# m public long minimumTime(int[] time, int totalTrips) {
8 r2 M# O; c" F" n long left = 0, right = (long) 1e14;( Y& D% O% s, M7 D( g
while (left + 1 < right) {% |3 R% H$ C; ]. k
long mid = (left + right) / 2;
8 {( N" f) h/ R2 u" b0 n2 N, k) x& K3 C if (check(mid, time, totalTrips)) {
N8 c# S) m2 V8 o5 [0 f% U right = mid;" e% v. a4 e, g" }
} else {/ _" { h1 Z) `5 S# h. e5 N% B- V
left = mid;2 W/ q7 _& l7 @5 V
}
; ]% X; m6 V) r5 J; D9 J9 m: U }
9 N. I, t9 h% V return check(left, time, totalTrips) ? left : right;
$ l' I' ~+ ^1 ]: n }$ V V- G V- I( C" F' G
) H1 `5 H4 E4 D4 f# d) L
private boolean check(long limit, int[] time, long totalTrips) {
8 M6 @9 [* k) ~: Z for (int t : time) {7 s6 a) b7 T, c9 y+ H) B) ]5 x
totalTrips -= limit / t;+ F' V+ }3 K }9 S- m6 v
}4 J i+ J- f& M9 E. p
return totalTrips <= 0;
2 w4 Z* f; S, V }
$ ?& ~ k# a% Y2 ^; H6 N$ i}6 z& e# c! o" d& F3 Y9 G
. _- O2 g- a0 c3 t
【 NO.4 完成比赛的最少时间】
3 e9 C* ~ l. R4 e* k1 W
7 E8 n% j1 ^: V7 F& G解题思路
' g" w c: }8 ]: X, q8 n动态规划问题。# W% ?! v- u& M, T, X
! x9 q! k, M# Z: ?" ~! @& |先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
# Q5 O: P+ Y7 n! i5 @* z
: `/ P- a( X" @% F然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
( S x4 U4 W+ l3 q! [6 B& e9 [/ h1 D
1 p& Z ]7 V: x注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。; L% F7 w3 H) s
1 M( |) \' T* ~8 x0 K$ w8 q由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。2 F0 O) @0 `5 M' D. ~! f* l
+ _4 X$ H8 v* H6 y( y
代码展示5 {( I% n# U. N
class Solution {. Q" ~1 E' U, D% @5 B
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
" n. C6 v4 H: Z2 ?- T1 i+ u8 a // g[i] 表示不换轮胎完成 i 圈的最短时间
3 A R) Y2 V. L; Y% x: v# s4 m long[] g = new long[numLaps + 1];0 t. H7 r1 u7 q5 n- c
Arrays.fill(g, Long.MAX_VALUE);* _2 n' t. P# M9 V
for (int[] t : tires) {- C- v2 ?7 g- j1 X# X3 q, B5 W
long pn = 1, sum = t[0];6 M _: i/ n$ \' S g* P
for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {, g; r+ \# o" k/ ?0 f i8 h
g[i] = Math.min(g[i], sum);" f+ {2 @% U* E; z* }
pn *= t[1];
6 j( m e$ M( j3 O sum += t[0] * pn;
% s: v" a. y+ a" y& z }4 y2 P9 E$ c; E0 X
}
. ]% a/ s0 W3 t6 G. y
" x3 c/ z0 M% b% z* M // f[i] 表示完成 i 圈的最短时间
# G+ E8 }1 b. x/ d" S! u0 q6 ]4 ] long[] f = new long[numLaps + 1];
6 `1 f- |" ~ K* y Arrays.fill(f, Integer.MAX_VALUE);- Q+ L* P+ g3 F; x
f[0] = 0;
2 _+ I* `7 \+ B. y) x, M for (int i = 1; i <= numLaps; i++) {
1 }" L4 m i9 ` for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
8 K& k( p0 n. | f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
& n4 q* o) D& f! I; O }8 h0 L; I8 X, P, w" O# v% S0 {6 T
}
* q2 Z7 Z# ~: w$ x9 k: m; F P return (int) (f[numLaps] - changeTime);" Y0 \2 }+ F& X0 X
}: S% P# L/ ?" c' M4 d
}
* Z5 }' L0 b$ }$ d9 ` |