登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】
- a% T; ~( K9 I' h! M+ @4 F6 m& I/ n! B, }; N5 E5 h
解题思路
* b+ E$ j% q2 Q: w签到题,枚举即可。
6 L# R& i9 e- E, q e: T6 ^
( m( z+ v2 u: I7 A h. H( i代码展示: U1 @* ?6 e; @
7 A" r4 ^8 E+ k( s- y7 _: N1 y) s
class Solution {5 ]5 u, s& M' \; @5 ]9 q: u
public int prefixCount(String[] words, String pref) {! A0 z7 R+ {, U4 X% @
int count = 0;
& p _. W2 R, g/ z: M% Q$ { for (String word : words) {$ h/ s% |; ^4 e+ B9 r* b9 t
if (word.indexOf(pref) == 0) {
3 D# p5 [) j. ]/ G6 B2 k count++;7 Z3 |" `+ S8 ]4 b. t( U
}
' F' @. d- g/ Q% [& ^+ E }
, u. D4 P, x0 t. z+ A% d return count;4 r& F! q4 T; r
}
: e! J9 I9 G4 U5 A* v9 ?}, f3 D' ^; j3 L6 W5 m1 A% a. Y% n
: N: [! p6 I# I/ w4 ~6 ?# i' M W( u
4 s0 y0 Y+ _, A1 w, h【 NO.2 使两字符串互为字母异位词的最少步骤数】
/ P# c. X. U7 z& o8 X0 P# {. _
解题思路( I E" R! c8 W
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
2 T& r5 h2 p8 N5 _ R: s8 y8 o" L! j# ?% `9 P
代码展示8 E6 n$ n2 C5 q% U6 W/ s" {
class Solution {$ j; y9 S& j7 t8 n" p3 L9 |0 j& w
public int minSteps(String s, String t) {
* i) r+ i- P! E: z1 |! k6 h& V int[] countS = countLetters(s);
; x0 A$ }( C( D8 [9 E0 w int[] countT = countLetters(t);
6 ~' ~9 x8 O# `$ W* j int result = 0; t: ?2 y/ F! y4 V, S/ {3 I
for (int i = 0; i < 26; i++) {
3 t% b8 S' e: w3 U) F5 z result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
/ s' f" k$ P7 L }
" x7 V9 W1 J `4 T" i5 \ return result;3 |7 D; D/ g2 B7 y" [' O% O
}
1 c4 |, J% F1 s% D4 C* y
" F6 L% V5 V6 ]* A, y+ p private int[] countLetters(String s) {
- t) E0 N% z# r, |* p. A: N% M int[] count = new int[26];: ~$ U- }: D$ m9 U" {1 O& F& l* Y
for (int i = 0; i < s.length(); i++) {) i l! ?/ t& t& }( z2 g4 t; G
count[s.charAt(i) - 'a']++;
, T) l& R* U$ q c }1 |+ O4 Y _& B2 X8 u
return count;
, V( [+ R9 V. H }$ |$ c; _! S. A7 G
}% Z. p8 `6 `+ M- i2 j5 ^
* C% @! N( T/ |# z8 P
# Y0 @" O$ v w! i# M7 s【 NO.3 完成旅途的最少时间】+ E" |- E+ C' s$ X
; i) F. V9 v3 E* W/ L- x o解题思路
, y+ P6 R8 |% ?典型的二分答案题目。
( }. w' R% s' ~* s0 F# a: O) j5 T$ j
代码展示
2 ^" x/ b/ H7 i/ l$ Pclass Solution {& ~' a1 }6 r+ j i" W+ A4 {
public long minimumTime(int[] time, int totalTrips) {- c! v9 P. d0 j9 z
long left = 0, right = (long) 1e14;
( |, L) j: U8 y4 p8 ?+ I while (left + 1 < right) {
, V/ b! P4 V* A, l2 f/ R long mid = (left + right) / 2;, X9 R) c6 J) A) [0 j4 l. j
if (check(mid, time, totalTrips)) {
% I r5 K/ y1 | y9 m) F$ Q right = mid;0 U+ x2 U' K3 K% M; u
} else {+ m! ]3 l! |4 J* r; I# n& ? l
left = mid;. G- C! V& Q/ g; Z% t
}
* D5 q- w; Z5 h I# P }
$ n \3 v3 v6 w) }1 D) h4 p7 c return check(left, time, totalTrips) ? left : right;! Q4 {! A1 S S& `/ e7 D" ?. V
}9 Q! o# w' X" R4 u
S, d8 {5 p' J( v
private boolean check(long limit, int[] time, long totalTrips) {0 Y+ D+ M$ g% L0 y" x$ U+ a
for (int t : time) {
Z& P0 z. o. t: G# t9 f2 _ totalTrips -= limit / t;
! G/ B4 ^" f' v* `2 s( @( L }
; }- V" c$ f6 j, m return totalTrips <= 0;
. N4 P& s* M9 t/ b& Y: F; B i }
8 N* F( `# L8 T1 B% P4 S7 l3 A( R}
. A7 L/ z* U9 F. o7 T. |% W
& I$ n2 I9 ^$ F# u' H: `# _. [! y【 NO.4 完成比赛的最少时间】0 K. L* K+ |1 h
! G1 a8 X# w4 U& z
解题思路
5 m, A, t0 a! C( L2 A/ q6 \! ]1 H动态规划问题。 f* }8 [$ C9 \
2 A/ J/ {/ u+ m9 u' j7 r# Y7 y先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。" P+ x, k/ Q6 e( G7 _+ a2 A8 Q) K
3 {) p: I. e2 R
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
* U6 _9 k( h1 A, }8 Y
/ u: M. x! ]" t; g% n* F注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。 ~0 ]* |, k) f5 H3 X: l( H
! C; T( c# g5 I C! ]" k, v4 ?, o
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
. y- J7 ]( r S- k' L! D0 \& |* H h" [: t+ @; g3 N' g# h
代码展示: B" C% r+ z) S. V
class Solution {
' e& ?' V: b. Q0 A$ }4 | public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {6 V; x) X6 j+ A$ }- P& e
// g[i] 表示不换轮胎完成 i 圈的最短时间, g( N* [7 m4 R3 @1 c' I
long[] g = new long[numLaps + 1];
# ?. K4 I" f" F# u Arrays.fill(g, Long.MAX_VALUE); v. P! s9 S. _. T. _. u) k
for (int[] t : tires) {
" @3 u3 q1 t4 a5 `% ]8 i4 R long pn = 1, sum = t[0];
. _8 S( T- j8 Y5 Z' W for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {
2 m2 L% E6 W/ J: e g[i] = Math.min(g[i], sum);
2 p6 T( O4 K! O( f1 d0 R6 x, t, | pn *= t[1];
! S- C4 ?( O ], p2 F9 o sum += t[0] * pn;2 e' [1 g' a0 ~- a
}
0 e( U5 y @0 q/ w* _$ V }
L& ~. [2 s( ?- H9 J- G
9 C7 i# D) V( j1 M2 V9 ? w6 { // f[i] 表示完成 i 圈的最短时间
( C8 q% `: ~/ r long[] f = new long[numLaps + 1];
; A- R; k, O* N Arrays.fill(f, Integer.MAX_VALUE); @! S) O" k3 g; S. k" [5 T) @
f[0] = 0;
$ x! U) k) @5 O j# F! l for (int i = 1; i <= numLaps; i++) {/ h% x4 [7 d* x4 q! q. c |5 P
for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {1 ] n. u7 K# q1 Y% ?) e
f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
8 O6 D" K1 Z8 g+ h3 l. B }$ {0 {/ j6 j; j5 F# \/ r
}
( i7 @- a7 D2 m6 Y$ d8 z4 T4 |: p2 G return (int) (f[numLaps] - changeTime);# `6 W: D) h0 F' C7 y2 ^) ^9 f* W) @
}
& E* e3 _) h& t+ t* D& j! f3 [}1 e V9 c; U$ b( x' S( ?
|