Skip to content

Commit e583f06

Browse files
authored
feat: add solutions to lc problem: No.2188 (#1630)
No.2188.Minimum Time to Finish the Race
1 parent 01e6230 commit e583f06

File tree

9 files changed

+424
-6
lines changed

9 files changed

+424
-6
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
</p>
44

55
<p align="center">
6-
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Java%20%7C%20Python%20%7C%20C%2B%2B%20%7C%20Go%20%7C%20TypeScript%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
76
<a href="https://doocs.github.io/#/?id=how-to-join"><img src="https://img.shields.io/badge/organization-join%20us-42b883?style=flat-square" alt="open-source-organization"></a>
7+
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Python%20%7C%20Java%20%7C%20C++%20%7C%20Go%20%7C%20TypeScript%20%7C%20Rust%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
88
<a href="https://github.com/doocs/leetcode/blob/main/LICENSE"><img src="https://img.shields.io/github/license/doocs/leetcode?color=42b883&style=flat-square" alt="LICENSE"></a><br>
99
<a href="https://opencollective.com/doocs-leetcode/backers/badge.svg" alt="backers on Open Collective"><img src="https://img.shields.io/opencollective/backers/doocs-leetcode?color=42b883&style=flat-square&logo=open%20collective&logoColor=ffffff" /></a>
1010
<a href="https://github.com/doocs/leetcode/stargazers"><img src="https://img.shields.io/github/stars/doocs/leetcode?color=42b883&logo=github&style=flat-square" alt="stars"></a>

README_EN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
</p>
44

55
<p align="center">
6-
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Java%20%7C%20Python%20%7C%20C%2B%2B%20%7C%20Go%20%7C%20TypeScript%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
76
<a href="https://doocs.github.io/#/?id=how-to-join"><img src="https://img.shields.io/badge/organization-join%20us-42b883?style=flat-square" alt="open-source-organization"></a>
7+
<a href="https://github.com/doocs/leetcode"><img src="https://img.shields.io/badge/langs-Python%20%7C%20Java%20%7C%20C++%20%7C%20Go%20%7C%20TypeScript%20%7C%20Rust%20%7C%20...-red?style=flat-square&color=42b883" alt="languages"></a>
88
<a href="https://github.com/doocs/leetcode/blob/main/LICENSE"><img src="https://img.shields.io/github/license/doocs/leetcode?color=42b883&style=flat-square" alt="LICENSE"></a><br>
99
<a href="https://opencollective.com/doocs-leetcode/backers/badge.svg" alt="backers on Open Collective"><img src="https://img.shields.io/opencollective/backers/doocs-leetcode?color=42b883&style=flat-square&logo=open%20collective&logoColor=ffffff" /></a>
1010
<a href="https://github.com/doocs/leetcode/stargazers"><img src="https://img.shields.io/github/stars/doocs/leetcode?color=42b883&logo=github&style=flat-square" alt="stars"></a>

solution/2100-2199/2188.Minimum Time to Finish the Race/README.md

+157-2
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,183 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:预处理 + 动态规划**
67+
68+
我们注意到,连续使用同一个轮胎 $(f, r)$ 跑 $i$ 圈,那么第 $i$ 圈的耗时不应该超过 $changeTime + f$,否则我们可以在第 $i$ 圈的时候换轮胎,这样总耗时会更少。即:
69+
70+
$$
71+
f \times r^{i-1} \leq changeTime + f
72+
$$
73+
74+
我们可以求出满足上式的最大的 $i$,要使得 $i$ 最大,那么 $f$ 和 $r$ 应该尽可能小,根据题目的数据范围,我们取 $f=1$, $r=2$,那么 $2^{i-1} \leq changeTime + 1$,即 $i \leq \log_2(changeTime + 1) + 1$。根据这个结论,以及题目中 $changeTime$ 的数据范围,我们可以知道 $i$ 最大为 $17$。
75+
76+
我们定义 $cost[i]$ 表示使用同一个轮胎跑 $i$ 圈的最小耗时,那么我们可以预处理出 $cost$ 数组,然后使用动态规划求解即可。定义 $f[i]$ 表示跑 $i$ 圈的最小耗时,那么我们可以得到状态转移方程:
77+
78+
$$
79+
f[i] = (\min_{1 \leq j \leq \min(17, i)} f[i-j] + cost[j]) + changeTime
80+
$$
81+
82+
初始时 $f[0] = -changeTime$,最终答案为 $f[numLaps]$。
83+
84+
时间复杂度 $O((n + numLaps) \times \log T_{max})$,空间复杂度 $O(n + \log T_{max})$,其中 $T_{max}$ 是题目中 $f_i$, $r_i$ 和 $changeTime$ 的最大值。本题中 $\log T_{max} \approx 17$。
85+
6686
<!-- tabs:start -->
6787

6888
### **Python3**
6989

7090
<!-- 这里可写当前语言的特殊实现逻辑 -->
7191

7292
```python
73-
93+
class Solution:
94+
def minimumFinishTime(
95+
self, tires: List[List[int]], changeTime: int, numLaps: int
96+
) -> int:
97+
cost = [inf] * 18
98+
for f, r in tires:
99+
i, s, t = 1, 0, f
100+
while t <= changeTime + f:
101+
s += t
102+
cost[i] = min(cost[i], s)
103+
t *= r
104+
i += 1
105+
f = [inf] * (numLaps + 1)
106+
f[0] = -changeTime
107+
for i in range(1, numLaps + 1):
108+
for j in range(1, min(18, i + 1)):
109+
f[i] = min(f[i], f[i - j] + cost[j])
110+
f[i] += changeTime
111+
return f[numLaps]
74112
```
75113

76114
### **Java**
77115

78116
<!-- 这里可写当前语言的特殊实现逻辑 -->
79117

80118
```java
119+
class Solution {
120+
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
121+
final int inf = 1 << 30;
122+
int[] cost = new int[18];
123+
Arrays.fill(cost, inf);
124+
for (int[] e : tires) {
125+
int f = e[0], r = e[1];
126+
int s = 0, t = f;
127+
for (int i = 1; t <= changeTime + f; ++i) {
128+
s += t;
129+
cost[i] = Math.min(cost[i], s);
130+
t *= r;
131+
}
132+
}
133+
int[] f = new int[numLaps + 1];
134+
Arrays.fill(f, inf);
135+
f[0] = -changeTime;
136+
for (int i = 1; i <= numLaps; ++i) {
137+
for (int j = 1; j < Math.min(18, i + 1); ++j) {
138+
f[i] = Math.min(f[i], f[i - j] + cost[j]);
139+
}
140+
f[i] += changeTime;
141+
}
142+
return f[numLaps];
143+
}
144+
}
145+
```
81146

147+
### **C++**
148+
149+
```cpp
150+
class Solution {
151+
public:
152+
int minimumFinishTime(vector<vector<int>>& tires, int changeTime, int numLaps) {
153+
int cost[18];
154+
memset(cost, 0x3f, sizeof(cost));
155+
for (auto& e : tires) {
156+
int f = e[0], r = e[1];
157+
int s = 0;
158+
long long t = f;
159+
for (int i = 1; t <= changeTime + f; ++i) {
160+
s += t;
161+
cost[i] = min(cost[i], s);
162+
t *= r;
163+
}
164+
}
165+
int f[numLaps + 1];
166+
memset(f, 0x3f, sizeof(f));
167+
f[0] = -changeTime;
168+
for (int i = 1; i <= numLaps; ++i) {
169+
for (int j = 1; j < min(18, i + 1); ++j) {
170+
f[i] = min(f[i], f[i - j] + cost[j]);
171+
}
172+
f[i] += changeTime;
173+
}
174+
return f[numLaps];
175+
}
176+
};
177+
```
178+
179+
### **Go**
180+
181+
```go
182+
func minimumFinishTime(tires [][]int, changeTime int, numLaps int) int {
183+
const inf = 1 << 30
184+
cost := [18]int{}
185+
for i := range cost {
186+
cost[i] = inf
187+
}
188+
for _, e := range tires {
189+
f, r := e[0], e[1]
190+
s, t := 0, f
191+
for i := 1; t <= changeTime+f; i++ {
192+
s += t
193+
cost[i] = min(cost[i], s)
194+
t *= r
195+
}
196+
}
197+
f := make([]int, numLaps+1)
198+
for i := range f {
199+
f[i] = inf
200+
}
201+
f[0] = -changeTime
202+
for i := 1; i <= numLaps; i++ {
203+
for j := 1; j < min(18, i+1); j++ {
204+
f[i] = min(f[i], f[i-j]+cost[j])
205+
}
206+
f[i] += changeTime
207+
}
208+
return f[numLaps]
209+
}
210+
211+
func min(a, b int) int {
212+
if a < b {
213+
return a
214+
}
215+
return b
216+
}
82217
```
83218

84219
### **TypeScript**
85220

86221
```ts
87-
222+
function minimumFinishTime(tires: number[][], changeTime: number, numLaps: number): number {
223+
const cost: number[] = Array(18).fill(Infinity);
224+
for (const [f, r] of tires) {
225+
let s = 0;
226+
let t = f;
227+
for (let i = 1; t <= changeTime + f; ++i) {
228+
s += t;
229+
cost[i] = Math.min(cost[i], s);
230+
t *= r;
231+
}
232+
}
233+
const f: number[] = Array(numLaps + 1).fill(Infinity);
234+
f[0] = -changeTime;
235+
for (let i = 1; i <= numLaps; ++i) {
236+
for (let j = 1; j < Math.min(18, i + 1); ++j) {
237+
f[i] = Math.min(f[i], f[i - j] + cost[j]);
238+
}
239+
f[i] += changeTime;
240+
}
241+
return f[numLaps];
242+
}
88243
```
89244

90245
### **...**

solution/2100-2199/2188.Minimum Time to Finish the Race/README_EN.md

+137-2
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,154 @@ The minimum time to complete the race is 25 seconds.
6464
### **Python3**
6565

6666
```python
67-
67+
class Solution:
68+
def minimumFinishTime(
69+
self, tires: List[List[int]], changeTime: int, numLaps: int
70+
) -> int:
71+
cost = [inf] * 18
72+
for f, r in tires:
73+
i, s, t = 1, 0, f
74+
while t <= changeTime + f:
75+
s += t
76+
cost[i] = min(cost[i], s)
77+
t *= r
78+
i += 1
79+
f = [inf] * (numLaps + 1)
80+
f[0] = -changeTime
81+
for i in range(1, numLaps + 1):
82+
for j in range(1, min(18, i + 1)):
83+
f[i] = min(f[i], f[i - j] + cost[j])
84+
f[i] += changeTime
85+
return f[numLaps]
6886
```
6987

7088
### **Java**
7189

7290
```java
91+
class Solution {
92+
public int minimumFinishTime(int[][] tires, int changeTime, int numLaps) {
93+
final int inf = 1 << 30;
94+
int[] cost = new int[18];
95+
Arrays.fill(cost, inf);
96+
for (int[] e : tires) {
97+
int f = e[0], r = e[1];
98+
int s = 0, t = f;
99+
for (int i = 1; t <= changeTime + f; ++i) {
100+
s += t;
101+
cost[i] = Math.min(cost[i], s);
102+
t *= r;
103+
}
104+
}
105+
int[] f = new int[numLaps + 1];
106+
Arrays.fill(f, inf);
107+
f[0] = -changeTime;
108+
for (int i = 1; i <= numLaps; ++i) {
109+
for (int j = 1; j < Math.min(18, i + 1); ++j) {
110+
f[i] = Math.min(f[i], f[i - j] + cost[j]);
111+
}
112+
f[i] += changeTime;
113+
}
114+
return f[numLaps];
115+
}
116+
}
117+
```
73118

119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
int minimumFinishTime(vector<vector<int>>& tires, int changeTime, int numLaps) {
125+
int cost[18];
126+
memset(cost, 0x3f, sizeof(cost));
127+
for (auto& e : tires) {
128+
int f = e[0], r = e[1];
129+
int s = 0;
130+
long long t = f;
131+
for (int i = 1; t <= changeTime + f; ++i) {
132+
s += t;
133+
cost[i] = min(cost[i], s);
134+
t *= r;
135+
}
136+
}
137+
int f[numLaps + 1];
138+
memset(f, 0x3f, sizeof(f));
139+
f[0] = -changeTime;
140+
for (int i = 1; i <= numLaps; ++i) {
141+
for (int j = 1; j < min(18, i + 1); ++j) {
142+
f[i] = min(f[i], f[i - j] + cost[j]);
143+
}
144+
f[i] += changeTime;
145+
}
146+
return f[numLaps];
147+
}
148+
};
149+
```
150+
151+
### **Go**
152+
153+
```go
154+
func minimumFinishTime(tires [][]int, changeTime int, numLaps int) int {
155+
const inf = 1 << 30
156+
cost := [18]int{}
157+
for i := range cost {
158+
cost[i] = inf
159+
}
160+
for _, e := range tires {
161+
f, r := e[0], e[1]
162+
s, t := 0, f
163+
for i := 1; t <= changeTime+f; i++ {
164+
s += t
165+
cost[i] = min(cost[i], s)
166+
t *= r
167+
}
168+
}
169+
f := make([]int, numLaps+1)
170+
for i := range f {
171+
f[i] = inf
172+
}
173+
f[0] = -changeTime
174+
for i := 1; i <= numLaps; i++ {
175+
for j := 1; j < min(18, i+1); j++ {
176+
f[i] = min(f[i], f[i-j]+cost[j])
177+
}
178+
f[i] += changeTime
179+
}
180+
return f[numLaps]
181+
}
182+
183+
func min(a, b int) int {
184+
if a < b {
185+
return a
186+
}
187+
return b
188+
}
74189
```
75190

76191
### **TypeScript**
77192

78193
```ts
79-
194+
function minimumFinishTime(tires: number[][], changeTime: number, numLaps: number): number {
195+
const cost: number[] = Array(18).fill(Infinity);
196+
for (const [f, r] of tires) {
197+
let s = 0;
198+
let t = f;
199+
for (let i = 1; t <= changeTime + f; ++i) {
200+
s += t;
201+
cost[i] = Math.min(cost[i], s);
202+
t *= r;
203+
}
204+
}
205+
const f: number[] = Array(numLaps + 1).fill(Infinity);
206+
f[0] = -changeTime;
207+
for (let i = 1; i <= numLaps; ++i) {
208+
for (let j = 1; j < Math.min(18, i + 1); ++j) {
209+
f[i] = Math.min(f[i], f[i - j] + cost[j]);
210+
}
211+
f[i] += changeTime;
212+
}
213+
return f[numLaps];
214+
}
80215
```
81216

82217
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
int minimumFinishTime(vector<vector<int>>& tires, int changeTime, int numLaps) {
4+
int cost[18];
5+
memset(cost, 0x3f, sizeof(cost));
6+
for (auto& e : tires) {
7+
int f = e[0], r = e[1];
8+
int s = 0;
9+
long long t = f;
10+
for (int i = 1; t <= changeTime + f; ++i) {
11+
s += t;
12+
cost[i] = min(cost[i], s);
13+
t *= r;
14+
}
15+
}
16+
int f[numLaps + 1];
17+
memset(f, 0x3f, sizeof(f));
18+
f[0] = -changeTime;
19+
for (int i = 1; i <= numLaps; ++i) {
20+
for (int j = 1; j < min(18, i + 1); ++j) {
21+
f[i] = min(f[i], f[i - j] + cost[j]);
22+
}
23+
f[i] += changeTime;
24+
}
25+
return f[numLaps];
26+
}
27+
};

0 commit comments

Comments
 (0)