登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】2 h( y( c6 x! n/ U3 C
9 \+ T) a, @2 C
解题思路/ E+ c- t* ?1 g) Q) y: G/ _
签到题,枚举即可。
2 _; ]; j( Q$ v: U# D2 v
2 K- Y2 _8 x3 T4 Z8 a/ K) M6 O代码展示
& H# C g# b4 y% S6 H
+ d0 `& h0 Q1 ^8 v z& P5 Qclass Solution {* z% z1 A" T2 D0 `/ e7 F7 B
public int prefixCount(String[] words, String pref) {3 x! B: p8 G) ~; Y" S2 N. |$ J
int count = 0;2 ?3 e$ K. A3 ]5 Z/ o$ j
for (String word : words) {
8 P2 N# {( _3 g; L. m) h9 X* P if (word.indexOf(pref) == 0) {" I/ z) b4 A7 j1 D8 r
count++;
! Y0 I$ q& i$ m& [ X9 W @ }
! S7 L$ b! F& l$ o2 `( t% Z }
; T+ a! M4 M) }. m; }6 [ return count;
9 _! P* n% E# [, P6 ?5 @9 h } R* X# g6 g8 _* I/ u# c
}
- l- F' M5 q4 ^2 b8 E1 V3 ]# n3 ^
6 v3 p3 N B" d0 E0 O, F" y! i. O/ h, D
【 NO.2 使两字符串互为字母异位词的最少步骤数】2 [* j* k6 ^. g$ v
) D+ g! ~8 C" x a解题思路! E9 b. |0 Z, c1 D" v$ |3 s
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
% C' m$ X" ?# ?
+ B. Z4 t/ e9 r代码展示
' Z7 G" H! V) ^; N! Aclass Solution {" J/ W! J$ n% t+ r5 `3 @+ }
public int minSteps(String s, String t) {* e8 k* s; }1 y, n e7 B
int[] countS = countLetters(s);) G a2 f' V( }
int[] countT = countLetters(t);
|& I9 w- @' q int result = 0;
6 ~6 y9 ]+ C/ q6 C' G D+ `+ G for (int i = 0; i < 26; i++) {
5 F& K. o/ H+ W; p1 [5 v result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);! P+ S. O: i3 u% M' F
}
]* p, M0 L3 r% F7 N return result;$ X% q. {( E+ ^8 K% ^! ~
}$ W9 i& e, G& E; u# P8 U4 t- u
& V# F' R- |5 e4 u, F7 j" j
private int[] countLetters(String s) {$ O4 A; P7 n- V9 Q; t) n1 ^% c" K
int[] count = new int[26];# x3 d* O9 R8 | K
for (int i = 0; i < s.length(); i++) {3 S: P8 U% n+ q, C7 L b
count[s.charAt(i) - 'a']++;
) \ f4 V2 N$ ]/ H* \* { Q; ~ }! O) Y* d+ a( d' G" q2 x; d
return count; m/ B2 j, r9 e% j7 Z' Y
}: Z1 T& C' y6 U; b
}
+ [* L5 r! C1 f# |3 Q! q- b! B. L% W( }& Z% G+ q# ?9 i
9 O+ K1 g, k2 [/ m: Z: F! y【 NO.3 完成旅途的最少时间】
J- Z) v, g* L7 C0 C# w' R' E+ N2 P9 H, d5 k, f( O' J+ r
解题思路! w4 X& E0 u) M- S
典型的二分答案题目。5 n7 Q3 k! a% o8 z2 C9 ?' y
0 L+ G% e z, S9 |) b代码展示$ K; ^3 k% L4 `2 q4 y1 m% ]. |
class Solution {
4 L; u, J& o4 ^* E f public long minimumTime(int[] time, int totalTrips) {
, a8 w E! k) }9 p+ v8 T$ ?0 y8 {2 L- x long left = 0, right = (long) 1e14;0 j# g2 T/ J$ Z
while (left + 1 < right) {
- ^6 A6 m, L# ~3 K1 R2 {* `( M: ~! c long mid = (left + right) / 2;. j" M2 q2 C! q8 ]# L* i
if (check(mid, time, totalTrips)) {
: l! u# v) r6 i) N7 C- ?5 G6 ? right = mid;- |6 g0 {# `8 U0 c# h
} else {+ R! x1 S+ p; P. q
left = mid;, f/ I" o& x( a( T
}
3 }3 y- v+ [" Q/ ^' N }5 ?9 U% i' M* h S$ O: S
return check(left, time, totalTrips) ? left : right;
$ j( P2 e0 V( W" A }
2 H6 d1 C/ x5 A, p7 s" g7 F
7 ~+ [! L( z6 `# ]( Z0 J" p6 B) F private boolean check(long limit, int[] time, long totalTrips) {- v0 f7 ]. R$ t' p1 [$ Z: r
for (int t : time) {! F& M# }' d7 f& y
totalTrips -= limit / t;6 \) p& {' e+ g' L) p# c* c
}
; `8 l9 h" P6 h* G5 x. r8 O return totalTrips <= 0;% u, k. q) B4 T
}
@& I, g9 D5 c$ Z7 `* I) C}# \6 C9 g. B! I4 C: R; t
, q1 y3 q/ U8 o$ z【 NO.4 完成比赛的最少时间】( i( s$ y! }, G( E- }3 v+ g
, V7 a3 t" ^9 n2 x! Z解题思路
$ N4 X/ A: J2 P动态规划问题。5 z( |' [4 G% [( r
) s: t, {- E) x& z. ?" @先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
: S k5 i* K# P' y' U
) O5 G6 y8 C. u# A! _$ y然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
+ g. x4 Q& g) r! m3 w* N' s+ a9 {, Z+ I0 y9 N
注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
) C) m* H/ R# f6 V7 I( c6 n$ T$ C; K6 R5 H/ Y
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。4 _+ [ h4 U; E
7 g) Y& ?- c6 `! @% Y; A$ E代码展示
/ B3 M; A$ Z% _' z7 M3 _class Solution {2 k, t' K) d. u# g
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {- J# F( x* z9 q& ?0 C2 j
// g[i] 表示不换轮胎完成 i 圈的最短时间3 z8 F8 c. Z3 n4 i) {$ o
long[] g = new long[numLaps + 1];
" s: X5 ]5 e* W8 d0 W Arrays.fill(g, Long.MAX_VALUE);' q7 M) O1 o( P+ V( G
for (int[] t : tires) {
( }9 U) h( G% e+ K' F: W long pn = 1, sum = t[0];
% B) k) N$ R" ^" a4 @) ]: q- }* |' A for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {9 H3 [0 ?' k4 V* G" f {# s7 g
g[i] = Math.min(g[i], sum);
8 f3 K9 ]0 N2 U. Q$ J' a( {/ X% ?' e: { pn *= t[1];+ m7 b' L0 I& j9 |( x
sum += t[0] * pn;' V; x& a' o; h# j6 [ M& ~
}
6 I5 V1 s# \* e }
' `' Y- d2 m2 Z" O* u0 ^0 b' s- j
9 ?8 L4 z% ]2 x$ R5 N, w5 a // f[i] 表示完成 i 圈的最短时间
9 j( C; l4 t+ P* y long[] f = new long[numLaps + 1];, ~6 ?: ?8 r9 E; t/ G% c0 {
Arrays.fill(f, Integer.MAX_VALUE);
* z$ [# q6 ^1 }, z0 W$ P8 S7 \ f[0] = 0;9 c4 t( A; O4 u5 v6 M' j: O8 `# z
for (int i = 1; i <= numLaps; i++) {# w9 }+ S8 Y) P; q; k# x1 ]
for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
; `+ W# F% }& P. M1 r f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
. V. p2 ?- V5 t2 ^, E& [ }
, C& V: T; X1 |! b6 }1 j: a }8 H( W: q3 m2 _' Y. e' e% e3 i4 ~
return (int) (f[numLaps] - changeTime);
& ?5 @9 _. g* o* |% o }: }) M {8 u, _+ V- S
}
. W& k/ v5 X" i, g, z: W |