登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】. Y0 r2 `% |5 g8 ?, a+ l2 B
) R, [6 }4 ~. E6 m2 V# d1 q- Y
解题思路
1 Y$ M8 F* }) X1 E签到题,枚举即可。
" ]/ q3 b3 `. Q8 y/ p0 s" `" _
0 \ y& _1 P% v) G, w2 R代码展示7 f+ M/ l. ^ m' d3 a
& e N# n: }- a+ dclass Solution {
) ^/ F3 |7 D/ D4 {' H) z) |! z1 ]. ] public int prefixCount(String[] words, String pref) {: }, }5 C+ X& L. b) l
int count = 0;
+ g6 \6 B" R: Q for (String word : words) {
, j- M% y4 ]- m$ A! _ |( I if (word.indexOf(pref) == 0) {
8 e0 i/ S9 @- K+ p* J count++;
1 S1 _( Y& X7 D6 k" s( H }
- n* |0 E% m+ o/ [ f( I, L }
9 x, R& l+ w( E4 U return count;
1 z- P* v" G& O0 O5 H }
8 B# x6 D. C7 J6 `6 n' M3 t}% m9 u3 L+ ?2 {6 u
7 `2 y9 R$ x& _) C/ V' r
; W, ~- ]/ `# M【 NO.2 使两字符串互为字母异位词的最少步骤数】
% o& c9 `+ Z( ]+ o0 N$ ]7 j0 p0 b( v, n# i
解题思路; C9 J0 K" U+ `7 j7 ~
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。! i# a. ^# N8 _: H, |
F; U( F2 B7 j, t
代码展示! V3 {, `& A% Q0 _2 V
class Solution {+ Z. S% c" c h5 j6 A
public int minSteps(String s, String t) {
' H* M9 v" w* t. c. n ? int[] countS = countLetters(s);" N. H* d+ {4 i+ T) k+ l5 \
int[] countT = countLetters(t);+ N r5 E. F& P1 s
int result = 0;
+ _, W7 w k5 l for (int i = 0; i < 26; i++) {
# a3 |- b* U6 X: e+ g result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]); z. W9 Z. g( O" @- s
}7 h1 Q& a+ v, _/ [4 t* w- D
return result;
; i( u. j. {" R5 W! ]& C }7 K# }6 o4 e9 _6 K) n
- j! x4 ]7 r' |+ T private int[] countLetters(String s) {( T/ J1 D k$ H, R! F. e
int[] count = new int[26];
& H1 ]; Z! f! l8 l/ J$ H4 X for (int i = 0; i < s.length(); i++) {
. P5 _- p4 \2 q' V count[s.charAt(i) - 'a']++;
2 g5 L5 }, B+ F% s! i, h% Y# Y" V* M8 T4 S }
* `7 I% W/ ]& C$ H- G. K return count;
( f: K7 O5 u$ Z0 b* f }
& G4 l/ o) C0 h: `* a9 [}+ K7 @; v% X7 ^ K
( c* }* Y" ^. [4 B' n8 i
H- f2 q0 [/ u1 o/ u! E$ \/ \
【 NO.3 完成旅途的最少时间】$ C$ Q& [# E& a& }' M
/ o7 p9 f! n( ?" z1 f
解题思路
7 \- R( T* f, e典型的二分答案题目。
* T: t: |: W/ @2 t- P, c1 ?$ ]3 O7 I4 ]; I
代码展示+ I {. i' K9 f5 p; y% j
class Solution {
w: F/ @# O, v3 i- t, v public long minimumTime(int[] time, int totalTrips) {) T8 [2 K$ X4 L8 U3 [; L
long left = 0, right = (long) 1e14;! C1 V6 J/ v9 M) |& K
while (left + 1 < right) {# j0 v. V4 z* W; S. @
long mid = (left + right) / 2;" m. x9 ?/ U. R7 ?6 j4 A6 r
if (check(mid, time, totalTrips)) {& x" C) ^2 Y; ~3 @: ?9 ]/ G
right = mid;
0 L& [7 M( h% ^6 Y) L } else {
5 r5 g8 D; k! q0 Q4 P left = mid;
8 M: `& `# ]8 u }3 z8 Q4 b5 O" J! [0 ?
}
3 k V0 {/ r) _# G/ c* [ return check(left, time, totalTrips) ? left : right;) ^0 R8 V/ C5 Z1 b2 F+ j2 d Q
}4 }( p8 f2 {- ~) `' I4 b; H
2 J3 w6 q3 \+ j1 e- s( ~; q private boolean check(long limit, int[] time, long totalTrips) {/ o/ P% I, w8 `# g/ \
for (int t : time) {- U& ^4 F- B+ ]2 o
totalTrips -= limit / t;
4 `; Y* i% L `6 W9 T }
7 J" f. N0 b6 ?' ? return totalTrips <= 0;
~* q7 U5 O& J- _9 [5 N+ _ }
4 P p1 B3 \ F. N: E ], D2 d}
1 }. O6 r4 i( c( \, q0 a* l3 j. e
【 NO.4 完成比赛的最少时间】1 z) M6 w, W4 ?2 P& a
3 i& Q' p* R" f' M. e! Q( e6 J _
解题思路1 q. k, H( X1 O7 c
动态规划问题。7 ~- [6 Q7 K% _% V( n
% f* A" ^" N( q
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。" p% q) N% [* A) K$ v6 l' x
" Y7 c' C4 J# J
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }4 [( {- \8 y8 m8 |* |( N
2 b/ K; f# [" y: L" A, z% D注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
* u8 M; b; A3 }' M. f2 ^
% l- L ?' V6 U4 d由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
6 V. Z/ N! X) x; R- @4 @( d6 o# [, y6 x1 s$ C7 u
代码展示& H( i6 N s# r7 e/ U
class Solution {1 p( Z. [& {6 {
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
( S7 @6 f5 z) f; i2 e // g[i] 表示不换轮胎完成 i 圈的最短时间! q( F& D2 |7 ]8 g
long[] g = new long[numLaps + 1];
1 V! |# V. u3 |! ?2 }! t Arrays.fill(g, Long.MAX_VALUE);4 S% F" C2 Q9 M% t+ @. `1 m
for (int[] t : tires) {4 l0 `& _0 p. s1 R9 x+ J f/ F/ H
long pn = 1, sum = t[0];& w4 o0 |7 w7 e: y6 p" j
for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {2 v% d# L q" w! `" a
g[i] = Math.min(g[i], sum);% P: a- J4 x% }2 H9 L) X7 I
pn *= t[1];
( C- r& O2 a4 Q2 m) \5 S% e, T sum += t[0] * pn;2 V/ |0 A7 _& i$ n) M* O- z# c* l/ P" N
}
. O: e6 o4 I# c9 {. S- i/ ?; U }
# Y# y$ ]" l; q7 m" c% n& N
; m" r8 e' n4 ~( ?6 o" l: ` // f[i] 表示完成 i 圈的最短时间
5 ?% U# R+ f5 i6 v long[] f = new long[numLaps + 1];" J- a) V* u7 J( x# `) ^
Arrays.fill(f, Integer.MAX_VALUE);2 T% K" X9 S$ S1 }9 i& N6 {
f[0] = 0;5 z6 U% H- I: U% E4 `1 R1 u+ T
for (int i = 1; i <= numLaps; i++) {! U" o* f$ V! g1 L* g8 a
for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {' v- W: K+ P& T# ~
f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);! @/ P7 I9 e, H) Q' V! K0 r
}$ V& s& B# V3 n& T: y" k' L
}& `: L* K8 j: E, E! \
return (int) (f[numLaps] - changeTime);
$ ?( n. D* A; [# d }$ n) u3 @ A0 l( c( w6 I' }
}
( M, s7 o( E! K( Z/ N* H3 b" N |