登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】
4 q0 |" O: ]7 _% M, H1 V
6 H! a( H4 I4 g! G5 B解题思路2 V" b# |, n+ b& h- I! s
签到题,枚举即可。9 j g2 u- n) {6 O6 a
' a5 X' I3 z O5 H; E1 w代码展示* O! y! ]4 a4 C& t+ y6 A
& \4 Y7 ?/ r% Z6 Y' D5 [
class Solution {
" t6 X5 V1 b& w2 n- j1 k public int prefixCount(String[] words, String pref) {
8 l N. c, W4 _- N5 _* Q int count = 0;
/ j# M& B6 `) h" m: L+ e' ^ for (String word : words) {
4 F9 y+ A' k9 m* v if (word.indexOf(pref) == 0) {+ H: g$ y3 P/ X" ^& Y( z. n
count++;2 g6 O5 c+ Z9 w! n. ^8 N) \
}
' ]! F* l( r( m3 O; m% W( n* o }
2 ]! v" Q& h# i- a- c return count;
! c0 Q+ n7 |7 X, j" a3 e }
9 E9 e6 ^7 P, a}
! i' i) d2 p; B, r, I# z3 B" m5 `: O
+ M* k( a$ w- A7 }' S0 w; ]0 k" C! X5 L' \
【 NO.2 使两字符串互为字母异位词的最少步骤数】
9 ~3 Z. T/ o2 I A2 p: F
3 a! V/ Y- v. ?+ R解题思路
; G- n5 Q" z. l: q" i% n- G字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
; u/ H1 X; Z3 q4 X7 s& T3 G1 V9 M) V( E! T3 \
代码展示& c P6 J) I9 l( F
class Solution {2 T2 D% c- H- M5 j% |$ h% j
public int minSteps(String s, String t) {
% k3 V; y# S0 G. j3 s: _ int[] countS = countLetters(s);4 q: e) m# d9 |( ?
int[] countT = countLetters(t);: Z4 Y2 U/ V0 |1 F5 t, H
int result = 0;9 q5 y6 J# O% P' r
for (int i = 0; i < 26; i++) {9 c) B8 d: t9 z% {$ G/ p& ~* B) z
result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);1 x% ` ?/ S f) }4 {( V: G
}% E; ]2 j* c' v+ J
return result;
' p: E+ W8 h: w3 c8 M: R }
0 R) c1 G' f. M; f9 I* }
4 M3 J5 ?9 z9 |; i) l private int[] countLetters(String s) {1 i" k. e5 H2 J
int[] count = new int[26];) X' `2 n. w6 _
for (int i = 0; i < s.length(); i++) {3 u8 I# W0 \) _* m' L/ v
count[s.charAt(i) - 'a']++;
, Q; o4 m7 ]( q, |: F }9 C% p( b7 h$ J$ E, @
return count;
; Q* i* M+ ]. r9 Y, i% T }
9 c. O4 M" w; {. m% f}
6 ~0 [. i+ O9 \) A! F
. Y( {! {/ y: B3 n+ j8 H9 {3 r' m6 z
【 NO.3 完成旅途的最少时间】; p- {7 R- L& s8 ?( b9 ~# H. ^ r
& _, ?9 j# H+ \ x; {4 k
解题思路. [: [- T5 B" ^
典型的二分答案题目。5 W& J" H3 Q6 |' X1 m! W$ }! {5 o# g
) n8 L* k5 |: o: D代码展示$ T, b/ x' p: g% U. x6 I
class Solution {
# g& t( u, k: x, p public long minimumTime(int[] time, int totalTrips) {
, e7 T# ~5 K: e, H+ m# } long left = 0, right = (long) 1e14;
" }) p- ?9 o z+ u$ V while (left + 1 < right) { T$ ^& S( B! ]9 | J$ U# B# P
long mid = (left + right) / 2;, h2 u; w2 Z# U v" z% [% X
if (check(mid, time, totalTrips)) {
* a6 z' d( O( o; ^% I* N: }9 f right = mid;
5 U7 d; [ z+ i8 {2 [ } else {# S7 I9 _, h! F7 ]" |9 P9 V
left = mid;2 b- A$ J* \# W) ? R
}0 {1 N/ `$ Q- s9 G2 [9 m
}. b+ i2 m: E% X! T
return check(left, time, totalTrips) ? left : right;; x6 V* O% A% A, { W/ j" N3 D; K
}
/ Z) L8 `$ n o x3 h0 n/ h, T; L
private boolean check(long limit, int[] time, long totalTrips) {( S+ I6 F: r k' b
for (int t : time) {
5 ]! E7 v- ^9 W totalTrips -= limit / t;6 t- g; [5 e2 [+ ?
}
; X# u/ c2 [; l8 F; } return totalTrips <= 0;3 w: E6 |5 G. K7 \
}2 w! _2 S9 B G+ I+ @, w3 P
}# S* u3 a6 z Q( J9 d% v. e- U
! }& q' g! K+ T2 Q6 k
【 NO.4 完成比赛的最少时间】
* i; H) ^1 m2 M, u& \4 u
: P: d; `8 `. [" v" _, q. M1 l解题思路' K' ~% m! Y4 U$ c4 Z
动态规划问题。
- i; E2 ?- a. D! @- U' | Y! e9 D9 T; |
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。3 [. X H6 Y3 U/ U0 A: ~5 n
% ?0 Y4 f2 i" D7 M然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
5 `8 c* I6 Z: f+ u' @* l
. m" t% P" t; r注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。7 G! N( B4 x6 K3 ^8 `
. Y) ]5 u& O% T5 @
由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
: r0 T5 P6 N' x R! {0 e2 J! h$ q7 F8 l" g8 e F& s
代码展示
) p' q5 L# r6 a; q! }class Solution {
- y7 I$ M3 A; y. G3 a! S. ? public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
. z, O; R) w& e) h1 F, z( O1 {$ ^ // g[i] 表示不换轮胎完成 i 圈的最短时间9 ]4 D/ {$ O" j1 Q$ }
long[] g = new long[numLaps + 1];
- N; G# q. y! W9 u+ T Arrays.fill(g, Long.MAX_VALUE);* H; j$ q: y! b3 }/ A4 r: E6 L
for (int[] t : tires) {
" g/ Z) E; G5 p& f- g: q5 x long pn = 1, sum = t[0];3 a3 C4 L1 c2 e) Z! r. }
for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {
$ ]* p% S) _8 P$ q# o; Q0 D g[i] = Math.min(g[i], sum);0 A; `4 J# [% |% y
pn *= t[1];( P: @; ?0 i8 F7 X
sum += t[0] * pn;
S% ~6 W! Z. ?. C3 N }
) r, o! c5 D2 W5 H }
0 S9 T1 h( }6 b$ d" I, B) _/ u) r- [5 K j. b) k! p' A* I
// f[i] 表示完成 i 圈的最短时间
4 ^$ S5 i) I, @( _: ^- u long[] f = new long[numLaps + 1];% a7 D* R: r3 Q2 U
Arrays.fill(f, Integer.MAX_VALUE);
" P: K: \7 G& Z# @ f[0] = 0;
_; `0 x6 d! W9 v1 ]1 S: J for (int i = 1; i <= numLaps; i++) {
7 W) r, e/ R% {7 N for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {6 O1 [! z( ]' y: J- l, C1 G: K
f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);$ q" _' V( s* ?+ d+ ]1 d7 J
}
8 Q3 c; v( |3 z+ z5 P8 c2 k }/ z/ e5 @ a! o6 R2 y
return (int) (f[numLaps] - changeTime);
9 j0 f% s( y5 ^5 [5 n+ i }
! }' K! N3 X3 R2 w$ v} X; f0 O1 w- q; C
|