登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 统计包含给定前缀的字符串】
, E2 Q& V+ U; ^ B4 M' L" Y E9 {$ T, c+ X5 r# h
解题思路7 @. H" R% Z0 j; b
签到题,枚举即可。- R! t6 k) Q+ p% r1 z
% [- {5 ]$ R/ u9 O% x
代码展示2 g+ J! U# F1 J3 V5 {5 |& J# R
# D: J9 I3 t* T \9 N
class Solution {- u, [+ ]$ a4 W' x! P
public int prefixCount(String[] words, String pref) {
z) h4 O0 y5 G* v- j3 ]' S. j int count = 0;1 Y7 ^& G' G. B! m1 b3 X3 r
for (String word : words) {
& e) \5 r8 ]) b2 E! Z$ `7 f4 I if (word.indexOf(pref) == 0) {0 ~8 n' e% h8 |# d/ j- S
count++;9 |& z, C. ~) {
}
9 H( T# P! s3 q1 b+ e; l5 ~; _ }5 l# D; z7 d: w. P, r/ f
return count;
* _# p3 i8 O" _' z: B* F7 c }. f6 q+ u5 M8 O: l
}* x( M* k7 O, L8 D( i7 J
. c: V+ _, i! T Z' J3 ?( E. z
# [3 ^- q. m* _" M【 NO.2 使两字符串互为字母异位词的最少步骤数】
! f7 T f' ?5 ?8 v9 u ^1 Y
6 X: l/ i. B( T3 `解题思路
* z: S9 l; p; U; Q$ z* l字母异位词 (anagram) 只需要满足各种字符的数量一致即可,所以统计两个字符串中,每种字母的出现次数,将少的补充直到达到数量相同即可。
9 _. a2 p1 U, m4 n! y3 _
4 b/ w: D9 d/ M/ {代码展示
, D3 [/ p+ G3 C5 l$ e) x# Zclass Solution {
3 _6 a! ^8 P, q public int minSteps(String s, String t) {
3 B8 S8 D& u( R/ h' i! e& u int[] countS = countLetters(s);
/ d6 A# Q' r1 ?' J$ L- U9 M int[] countT = countLetters(t);
L) R. J1 N* L4 |. L) C4 m$ d- K int result = 0;4 j3 K# u8 Y; ^: `8 z7 A* f: R
for (int i = 0; i < 26; i++) {; _4 R- g* G$ Q- p. ?
result += Math.max(countS[i], countT[i]) - Math.min(countS[i], countT[i]);
* Y; E- X! w' S, @ }% A' K9 x# X: k% L6 X& N' l; j1 d
return result;. O$ d5 ?+ U. E; c
}
6 ]3 y$ h+ r, k4 ^# q4 O% V' b) N7 T8 ^" y+ P# f9 F9 H
private int[] countLetters(String s) {5 j5 a1 L8 G0 h5 g2 s" T
int[] count = new int[26];8 V( `% S# U6 b2 b
for (int i = 0; i < s.length(); i++) {/ e0 f/ T) ?# {# ]7 A8 c
count[s.charAt(i) - 'a']++;2 N& x) a4 \# Q& G9 z) b' F8 R
}. Q- g: h4 Q% x; O) R
return count;8 `+ g8 |$ |' F. D5 B
}
# s) W& H1 X. `}: d8 f2 I" M3 _* i! \/ n) f% E
% j0 g) |5 M) W2 Z/ N$ }
# K% t7 k, {7 l1 s
【 NO.3 完成旅途的最少时间】+ _: U7 S0 R% |8 E; P
$ Y6 |8 F+ `( z H" g/ E0 S6 r9 {
解题思路
" K3 t) L! Y3 { W: y典型的二分答案题目。
' v; R M/ B% [/ x9 z, m3 u0 [6 s& z4 I2 p
代码展示
) u- O: N1 j6 kclass Solution {
G* p$ a% R! b. H: b public long minimumTime(int[] time, int totalTrips) {! }( C' O7 M: T; F; Q
long left = 0, right = (long) 1e14;
) k8 g4 N! x+ {- j4 ? v while (left + 1 < right) {6 j+ {' y+ h, R5 d
long mid = (left + right) / 2;" t, Z }4 b9 J H" M" ~
if (check(mid, time, totalTrips)) {6 W% G+ Q- H7 r4 e; K
right = mid;
# ~' u' f* D4 [% ]: T } else {8 [5 I! w# n5 Z$ ^, {
left = mid;( V4 W! ?0 l! D( q, [2 x( `
}
7 D5 h) x, d( q+ I1 } }
: t3 z6 f1 R4 a# F; n; Q return check(left, time, totalTrips) ? left : right;
& P, W/ V2 k/ a9 c1 w# J }
1 |8 n. Z f. M" A, A: n6 X! B' X3 {
private boolean check(long limit, int[] time, long totalTrips) {
, ]1 z% `6 Z* `' `0 | for (int t : time) {' \. c% a+ _8 {! i
totalTrips -= limit / t;, ]6 f+ o# [, w" C/ s' S
}
, t9 x7 |5 B4 L( D return totalTrips <= 0;
k8 ?6 E9 \4 \# O. ` }
$ g5 ~! Q6 b9 W# @ V}
# g/ |6 ~" p9 D2 y6 L0 J
) ^0 Z/ n+ r1 _3 j, u【 NO.4 完成比赛的最少时间】2 O+ ^" a* d, G$ A- q
6 ?% j# i8 }5 {
解题思路* P8 t, M. \7 r& g; u5 i
动态规划问题。
4 W* ^' ]4 u& V# _. R4 e5 L9 N" g8 j& u, A, }
先预处理求出 g[i] 表示不换轮胎完成 i 圈的最短时间,枚举所有的轮胎即可。
" c8 D A# k3 D5 U6 m+ l7 I) |& {1 p3 a" i! G' C
然后定义状态 f[i] 表示完成 i 圈的最短时间,状态转移方程即 f[i] = min{ f[i - j] + g[j] + changeTime }
% w" `" z2 A/ [+ m; }7 |
' J) z7 | P: Q* R# @, N- t6 }注意最终答案要减去多加的一次 changeTime, 以及运算过程中的溢出问题。
' L8 a7 s/ ?9 S) j! \: e7 B
! s) C: C% ^% m$ D7 }: x' B5 D由数据范围可知,最终答案一定不会超过 1e5 * 1000 * 2 (每次都换胎),该数值未超过 int 最大值,所以运算过程溢出的状态可以直接丢弃。
4 k" X5 h& v9 o* a. g0 Q& c. j1 v: v: {1 z3 v6 E
代码展示+ Y: w% F. F3 b( P
class Solution {
2 Q q6 t0 ]7 ]1 G public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {) M6 ~. Z9 }+ n6 ^4 K8 e
// g[i] 表示不换轮胎完成 i 圈的最短时间
" d5 q. }2 A# S$ @6 x2 T' R long[] g = new long[numLaps + 1];
( a1 C+ _1 I. c# ^( ^3 y Arrays.fill(g, Long.MAX_VALUE);
# `1 a6 b! W7 l for (int[] t : tires) {& F3 o1 S& b7 u- d4 J* Q5 v
long pn = 1, sum = t[0];. g8 S9 f* \5 G
for (int i = 1; i <= numLaps && sum < Integer.MAX_VALUE; i++) {8 r. d. b9 R, G3 g9 u
g[i] = Math.min(g[i], sum);+ [% P% C& P. l3 d% M* M/ M! [
pn *= t[1];$ F) ^/ |/ k7 y( A( K
sum += t[0] * pn;) M# c9 l# A; w1 q# q: j! A Q
}
2 X9 f' U" v! b" J }
- e' ~+ H5 j; g# P, |% G
; s, P2 U5 |0 m) Y // f[i] 表示完成 i 圈的最短时间) ], Y0 e4 j- D8 K9 U4 ]2 [
long[] f = new long[numLaps + 1];
$ b U) h) Z2 @' p5 S Arrays.fill(f, Integer.MAX_VALUE);
& Y& u; N( G; l# P: m$ } f[0] = 0;0 k: i3 D3 H! F4 k& U$ U H6 p0 [
for (int i = 1; i <= numLaps; i++) {' p# u% o/ y/ C7 c
for (int j = 1; j <= i && g[j] < Integer.MAX_VALUE; j++) {) e5 O. L( p0 X) I& q
f[i] = Math.min(f[i], f[i - j] + g[j] + changeTime);- k+ J4 f7 ~+ I# B: B( l) i; O" d
}2 y. [9 T" \0 R0 C
}
2 V u. O3 b0 }: ~ return (int) (f[numLaps] - changeTime);" R& i0 Y! W, Z3 Z& ~
}& s6 G+ o6 J, q' M- ]$ w
}/ W0 m) V) x0 R/ P# I B3 ]6 L
|