登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】7 A8 v0 q Z! K: _# l4 [
3 }2 g, R1 u5 P. i$ [解题思路
6 y- K2 P" E& u1 Z4 t3 X签到题,枚举即可。
- |5 \ R$ p/ {% ~ v1 S4 y/ E6 {! |2 f8 P& p, Q3 c0 j
代码展示! Z4 ~- Q+ e4 X; B
4 H, T7 _, p/ O, t6 A4 d
class Solution {5 h* e* P3 u' ?, w
public int prefixCount(String[] words, String pref) {
& b1 d @5 l/ S& l) b- s; \ int count = 0;# @" D1 v' P( S x
for (String word : words) {
+ Q) r3 | G8 b' _ if (word.indexOf(pref) == 0) {
( ]* o" w* }1 k5 o9 A count++;6 O8 `4 t. V. ~+ R/ |
}' @4 F% P1 C; c2 j% n* p% D
}/ T# i/ H% ?- o$ E( }7 i7 j/ q$ K
return count;, ]4 X8 ^* U4 e9 \! E, R
}' M! e+ V3 d b6 J; L. R: t
}
5 U9 r4 a2 N( |1 d |, a& C K# d, s- h
9 V( C- Y% a4 r* g5 y
【 NO.2 使两字符串互为字母异位词的最少步骤数】" M r+ }/ D/ D
: T% Y% o! Y; F+ `$ W解题思路% O% M, L& v8 e' N9 |* x9 x
字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。: h. x" j* p0 F; Y0 X
# x* U& q5 _5 l, J# e" p! J代码展示
4 I# {1 [) ^0 Cclass Solution {
/ ?4 B# ^* ~- e) E! O3 V public int minSteps(String s, String t) {
1 X3 e! T/ x% M7 Q) H int[] countS = countLetters(s);( @/ Y# N; @( j6 m
int[] countT = countLetters(t);: L0 l( l: M" p
int result = 0;
( o0 s4 P1 J* x4 @ for (int i = 0; i < 26; i++) {( W, i/ y9 B( R" ]6 f' _" g- W
result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
/ x" z) G" D; I' ]7 Y- V& | }
0 \1 e$ A. n& }/ f! A return result;
: g! y. ~, y7 r/ l, ^ }
9 c' e$ c3 _, R' O
2 j. l2 G' W; }. A! E private int[] countLetters(String s) {
5 V/ {# w7 a% B; D. W0 B5 B. D int[] count = new int[26];: f# B# j- |1 R3 R
for (int i = 0; i < s.length(); i++) {+ D$ w9 Q6 ^6 k( p0 _
count[s.charAt(i) - 'a']++;
- C2 e0 w1 m3 R }7 \9 Y! p, `( `) ^' }
return count;7 z( {- F4 P. g8 N" K
}! ~ L# K8 F: v$ Q9 Q
}
& Y2 A- O) x. v& P m4 t. P
" P7 `$ }$ a2 `- F o: N1 c) ^' r1 e7 Q' O+ ]$ `5 {
【 NO.3 完成旅途的最少时间】# Y& @0 L3 P5 {' u
9 t( F/ \4 i# B5 X解题思路
0 f X% U2 [5 w! c: n2 \6 ?8 i典型的二分答案题目。$ M* J: c! B* c \" D% N9 {; \. K2 h
+ x0 r& ]! V+ O3 B代码展示* V5 U1 N+ N6 y. E; s$ J+ L: X4 S
class Solution {+ o2 l* I0 f) \% J+ u' m# G5 U8 e
public long minimumTime(int[] time, int totalTrips) {$ J" z* {# n8 d, A
long left = 0, right = (long) 1e14;* S4 K$ Q, D) o8 l0 J2 h
while (left + 1 < right) {
) x* Y1 S4 G0 @; x3 P; k long mid = (left + right) / 2;" x' Z7 t3 N! p, Z. q; i. [
if (check(mid, time, totalTrips)) {4 E' k& |( V4 H* o" |+ Q( ?& h, R
right = mid;) g2 {: @6 N$ T
} else {5 F; w8 H4 z$ F" c9 \; ~
left = mid;" F. N/ _2 \: _" ]$ v
}
+ y0 W5 ?/ G2 j7 P }
' {3 m5 V' ^: e return check(left, time, totalTrips) ? left : right;5 O% }, f( _/ x/ w5 A5 w8 e7 P
}$ l0 K8 _8 J, l; _7 G
- v8 B4 s1 g/ ^+ K
private boolean check(long limit, int[] time, long totalTrips) {
& u6 g5 p+ r: l for (int t : time) {
9 q) B4 V# h$ t& k. N& B1 j( ~ totalTrips -= limit / t;7 ~3 H# \" I0 t( T9 H8 v8 Z
}
2 m% V, f) o q% G. `: m2 g' c return totalTrips <= 0;+ Q z' F, o/ x, `, N
}
6 W7 k; P" M2 ?+ ]6 |2 o}
% \( F' \& x* T \; u$ c7 W3 |5 E- w/ n/ A
【 NO.4 完成比赛的最少时间】
5 X' J. p4 O7 F. w/ E- j! R# u) `/ `! q
解题思路
6 V" `% L2 q U动态规划问题。
9 y! T! F+ X. z! h' L4 J( ]2 N) S) x8 n9 l! H* x
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。+ x, N$ X% O* e3 y4 f1 G. H
* z1 x y; W6 ^7 R/ f1 U3 \
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
) n1 H1 M) O' y% K% c! U. g R
0 C5 @ [" F6 e' B9 j* f注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。- O5 `) v0 F' y# z D
e# G/ X5 B' r2 C6 @
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。. L0 `: d* m# v* h1 B
) @% A# Y b- c5 _/ f
代码展示9 I/ B g d7 ~& A# f) E
class Solution {( c- t4 i0 U4 q$ s) m
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {, b; J. U+ a! h0 K7 A
// g[i] 表示不换轮胎完成 i 圈的最短时间! P% o# V; T0 N4 H* B* F5 B
long[] g = new long[numLaps + 1];
! {6 x5 Y4 [8 s3 j/ Q Arrays.fill(g, Long.MAX_VALUE);
8 S' K; m/ @2 V$ ~( s1 M for (int[] t : tires) {
2 m- V' s& p1 D/ t long pn = 1, sum = t[0];; A# i# j, z$ _
for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {
( g- {- r! s+ X0 }0 k' v g[i] = Math.min(g[i], sum);
9 X$ F6 P' _. I% m: w pn *= t[1];+ Y$ Q m2 e- y
sum += t[0] * pn;$ h% k- B% v5 T2 t2 z6 a
}
7 x. D) i" B0 p3 L }
4 {! l+ b9 [! v5 e- t
$ b( f [. L6 F // f[i] 表示完成 i 圈的最短时间. a6 z8 ~' [/ H0 U8 M+ |
long[] f = new long[numLaps + 1];
3 V/ P( |8 |" k' [8 P1 ^ Arrays.fill(f, Integer.MAX_VALUE);
% m5 _/ ]: Z+ s# U1 k! t. c3 w f[0] = 0;1 @; r& r2 _# \- U! ~' c4 M
for (int i = 1; i <= numLaps; i++) {
0 ^( b# C, [1 u* H7 _ for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {
% w9 O/ H( E" o7 Y% h9 \# f f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);
0 \8 ?; f+ y0 W5 e; a }
8 [- g8 d$ |. N/ I3 l8 F$ l }
' ^& d- X: N6 d% t/ V return (int) (f[numLaps] - changeTime);
/ }! {. J# P9 ^' }$ d9 Z* | }6 l& C$ E' C& M/ W; G+ A' C2 e& k+ j
}. k! X+ x( K2 p8 |
|