Skip to content

Commit 8dc3a5a

Browse files
committed
feat: add solutions to lc problem: No.0656
No.0656.Coin Path
1 parent 73b8d15 commit 8dc3a5a

File tree

7 files changed

+460
-2
lines changed

7 files changed

+460
-2
lines changed

solution/0600-0699/0656.Coin Path/README.md

Lines changed: 166 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,187 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
**方法一:动态规划(逆向)**
51+
52+
题目需要我们找到从下标 1 到下标 n 的最小花费路径,且字典序最小,我们可以使用动态规划求解。
53+
54+
我们定义 $f[i]$ 表示从下标 $i$ 到下标 $n-1$ 的最小花费。如果 $coins[n - 1] = -1$,则不存在从下标 $n-1$ 到下标 $n-1$ 的路径,直接返回空数组即可。否则,$f[n - 1] = coins[n - 1]$。
55+
56+
接下来,我们从下标 $n-2$ 开始,逆向遍历数组,对于下标 $i$,如果 $coins[i] = -1$,则 $f[i] = \infty$,否则,$f[i] = \min_{j = i + 1}^{min(n - 1, i + maxJump)} f[j] + coins[i]$。
57+
58+
然后我们判断 $f[0]$ 是否为 $\infty$,如果是,则不存在一条满足条件的路径,返回空数组即可。否则,我们的总花费为 $s = f[0]$,我们从下标 0 开始,向后遍历数组,如果 $f[i] = s$,则说明从下标 $i$ 到下标 $n-1$ 的花费为 $s$,我们将 $s$ 减去 $coins[i]$,并将下标 $i+1$ 加入到结果数组中,直到遍历到下标 $n-1$,返回结果数组即可。
59+
60+
时间复杂度 $O(n \times m)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别为数组的长度和最大跳跃长度。
61+
5062
<!-- tabs:start -->
5163

5264
### **Python3**
5365

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

5668
```python
57-
69+
class Solution:
70+
def cheapestJump(self, coins: List[int], maxJump: int) -> List[int]:
71+
if coins[-1] == -1:
72+
return []
73+
n = len(coins)
74+
f = [inf] * n
75+
f[-1] = coins[-1]
76+
for i in range(n - 2, -1, -1):
77+
if coins[i] != -1:
78+
for j in range(i + 1, min(n, i + maxJump + 1)):
79+
if f[i] > f[j] + coins[i]:
80+
f[i] = f[j] + coins[i]
81+
if f[0] == inf:
82+
return []
83+
ans = []
84+
s = f[0]
85+
for i in range(n):
86+
if f[i] == s:
87+
s -= coins[i]
88+
ans.append(i + 1)
89+
return ans
5890
```
5991

6092
### **Java**
6193

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

6496
```java
97+
class Solution {
98+
public List<Integer> cheapestJump(int[] coins, int maxJump) {
99+
int n = coins.length;
100+
List<Integer> ans = new ArrayList<>();
101+
if (coins[n - 1] == -1) {
102+
return ans;
103+
}
104+
int[] f = new int[n];
105+
final int inf = 1 << 30;
106+
Arrays.fill(f, inf);
107+
f[n - 1] = coins[n - 1];
108+
for (int i = n - 2; i >= 0; --i) {
109+
if (coins[i] != -1) {
110+
for (int j = i + 1; j < Math.min(n, i + maxJump + 1); ++j) {
111+
if (f[i] > f[j] + coins[i]) {
112+
f[i] = f[j] + coins[i];
113+
}
114+
}
115+
}
116+
}
117+
if (f[0] == inf) {
118+
return ans;
119+
}
120+
for (int i = 0, s = f[0]; i < n; ++i) {
121+
if (f[i] == s) {
122+
s -= coins[i];
123+
ans.add(i + 1);
124+
}
125+
}
126+
return ans;
127+
}
128+
}
129+
```
130+
131+
### **C++**
132+
133+
```cpp
134+
class Solution {
135+
public:
136+
vector<int> cheapestJump(vector<int>& coins, int maxJump) {
137+
int n = coins.size();
138+
vector<int> ans;
139+
if (coins[n - 1] == -1) {
140+
return ans;
141+
}
142+
int f[n];
143+
const int inf = 1 << 30;
144+
f[n - 1] = coins[n - 1];
145+
for (int i = n - 2; ~i; --i) {
146+
f[i] = inf;
147+
if (coins[i] != -1) {
148+
for (int j = i + 1; j < min(n, i + maxJump + 1); ++j) {
149+
f[i] = min(f[i], f[j] + coins[i]);
150+
}
151+
}
152+
}
153+
if (f[0] == inf) {
154+
return ans;
155+
}
156+
for (int i = 0, s = f[0]; i < n; ++i) {
157+
if (f[i] == s) {
158+
s -= coins[i];
159+
ans.push_back(i + 1);
160+
}
161+
}
162+
return ans;
163+
}
164+
};
165+
```
166+
167+
### **Go**
168+
169+
```go
170+
func cheapestJump(coins []int, maxJump int) (ans []int) {
171+
n := len(coins)
172+
if coins[n-1] == -1 {
173+
return
174+
}
175+
f := make([]int, n)
176+
f[n-1] = coins[n-1]
177+
const inf = 1 << 30
178+
for i := n - 2; i >= 0; i-- {
179+
f[i] = inf
180+
if coins[i] != -1 {
181+
for j := i + 1; j < n && j < i+maxJump+1; j++ {
182+
if f[i] > f[j]+coins[i] {
183+
f[i] = f[j] + coins[i]
184+
}
185+
}
186+
}
187+
}
188+
if f[0] == inf {
189+
return
190+
}
191+
for i, s := 0, f[0]; i < n; i++ {
192+
if f[i] == s {
193+
s -= coins[i]
194+
ans = append(ans, i+1)
195+
}
196+
}
197+
return
198+
}
199+
```
65200

201+
### **TypeScript**
202+
203+
```ts
204+
function cheapestJump(coins: number[], maxJump: number): number[] {
205+
const n = coins.length;
206+
const ans: number[] = [];
207+
if (coins[n - 1] == -1) {
208+
return ans;
209+
}
210+
const inf = 1 << 30;
211+
const f: number[] = new Array(n).fill(inf);
212+
f[n - 1] = coins[n - 1];
213+
for (let i = n - 2; i >= 0; --i) {
214+
if (coins[i] !== -1) {
215+
for (let j = i + 1; j < Math.min(n, i + maxJump + 1); ++j) {
216+
f[i] = Math.min(f[i], f[j] + coins[i]);
217+
}
218+
}
219+
}
220+
if (f[0] === inf) {
221+
return ans;
222+
}
223+
for (let i = 0, s = f[0]; i < n; ++i) {
224+
if (f[i] == s) {
225+
s -= coins[i];
226+
ans.push(i + 1);
227+
}
228+
}
229+
return ans;
230+
}
66231
```
67232

68233
### **...**

solution/0600-0699/0656.Coin Path/README_EN.md

Lines changed: 154 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,166 @@
3737
### **Python3**
3838

3939
```python
40-
40+
class Solution:
41+
def cheapestJump(self, coins: List[int], maxJump: int) -> List[int]:
42+
if coins[-1] == -1:
43+
return []
44+
n = len(coins)
45+
f = [inf] * n
46+
f[-1] = coins[-1]
47+
for i in range(n - 2, -1, -1):
48+
if coins[i] != -1:
49+
for j in range(i + 1, min(n, i + maxJump + 1)):
50+
if f[i] > f[j] + coins[i]:
51+
f[i] = f[j] + coins[i]
52+
if f[0] == inf:
53+
return []
54+
ans = []
55+
s = f[0]
56+
for i in range(n):
57+
if f[i] == s:
58+
s -= coins[i]
59+
ans.append(i + 1)
60+
return ans
4161
```
4262

4363
### **Java**
4464

4565
```java
66+
class Solution {
67+
public List<Integer> cheapestJump(int[] coins, int maxJump) {
68+
int n = coins.length;
69+
List<Integer> ans = new ArrayList<>();
70+
if (coins[n - 1] == -1) {
71+
return ans;
72+
}
73+
int[] f = new int[n];
74+
final int inf = 1 << 30;
75+
Arrays.fill(f, inf);
76+
f[n - 1] = coins[n - 1];
77+
for (int i = n - 2; i >= 0; --i) {
78+
if (coins[i] != -1) {
79+
for (int j = i + 1; j < Math.min(n, i + maxJump + 1); ++j) {
80+
if (f[i] > f[j] + coins[i]) {
81+
f[i] = f[j] + coins[i];
82+
}
83+
}
84+
}
85+
}
86+
if (f[0] == inf) {
87+
return ans;
88+
}
89+
for (int i = 0, s = f[0]; i < n; ++i) {
90+
if (f[i] == s) {
91+
s -= coins[i];
92+
ans.add(i + 1);
93+
}
94+
}
95+
return ans;
96+
}
97+
}
98+
```
99+
100+
### **C++**
101+
102+
```cpp
103+
class Solution {
104+
public:
105+
vector<int> cheapestJump(vector<int>& coins, int maxJump) {
106+
int n = coins.size();
107+
vector<int> ans;
108+
if (coins[n - 1] == -1) {
109+
return ans;
110+
}
111+
int f[n];
112+
const int inf = 1 << 30;
113+
f[n - 1] = coins[n - 1];
114+
for (int i = n - 2; ~i; --i) {
115+
f[i] = inf;
116+
if (coins[i] != -1) {
117+
for (int j = i + 1; j < min(n, i + maxJump + 1); ++j) {
118+
f[i] = min(f[i], f[j] + coins[i]);
119+
}
120+
}
121+
}
122+
if (f[0] == inf) {
123+
return ans;
124+
}
125+
for (int i = 0, s = f[0]; i < n; ++i) {
126+
if (f[i] == s) {
127+
s -= coins[i];
128+
ans.push_back(i + 1);
129+
}
130+
}
131+
return ans;
132+
}
133+
};
134+
```
135+
136+
### **Go**
137+
138+
```go
139+
func cheapestJump(coins []int, maxJump int) (ans []int) {
140+
n := len(coins)
141+
if coins[n-1] == -1 {
142+
return
143+
}
144+
f := make([]int, n)
145+
f[n-1] = coins[n-1]
146+
const inf = 1 << 30
147+
for i := n - 2; i >= 0; i-- {
148+
f[i] = inf
149+
if coins[i] != -1 {
150+
for j := i + 1; j < n && j < i+maxJump+1; j++ {
151+
if f[i] > f[j]+coins[i] {
152+
f[i] = f[j] + coins[i]
153+
}
154+
}
155+
}
156+
}
157+
if f[0] == inf {
158+
return
159+
}
160+
for i, s := 0, f[0]; i < n; i++ {
161+
if f[i] == s {
162+
s -= coins[i]
163+
ans = append(ans, i+1)
164+
}
165+
}
166+
return
167+
}
168+
```
46169

170+
### **TypeScript**
171+
172+
```ts
173+
function cheapestJump(coins: number[], maxJump: number): number[] {
174+
const n = coins.length;
175+
const ans: number[] = [];
176+
if (coins[n - 1] == -1) {
177+
return ans;
178+
}
179+
const inf = 1 << 30;
180+
const f: number[] = new Array(n).fill(inf);
181+
f[n - 1] = coins[n - 1];
182+
for (let i = n - 2; i >= 0; --i) {
183+
if (coins[i] !== -1) {
184+
for (let j = i + 1; j < Math.min(n, i + maxJump + 1); ++j) {
185+
f[i] = Math.min(f[i], f[j] + coins[i]);
186+
}
187+
}
188+
}
189+
if (f[0] === inf) {
190+
return ans;
191+
}
192+
for (let i = 0, s = f[0]; i < n; ++i) {
193+
if (f[i] == s) {
194+
s -= coins[i];
195+
ans.push(i + 1);
196+
}
197+
}
198+
return ans;
199+
}
47200
```
48201

49202
### **...**
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public:
3+
vector<int> cheapestJump(vector<int>& coins, int maxJump) {
4+
int n = coins.size();
5+
vector<int> ans;
6+
if (coins[n - 1] == -1) {
7+
return ans;
8+
}
9+
int f[n];
10+
const int inf = 1 << 30;
11+
f[n - 1] = coins[n - 1];
12+
for (int i = n - 2; ~i; --i) {
13+
f[i] = inf;
14+
if (coins[i] != -1) {
15+
for (int j = i + 1; j < min(n, i + maxJump + 1); ++j) {
16+
f[i] = min(f[i], f[j] + coins[i]);
17+
}
18+
}
19+
}
20+
if (f[0] == inf) {
21+
return ans;
22+
}
23+
for (int i = 0, s = f[0]; i < n; ++i) {
24+
if (f[i] == s) {
25+
s -= coins[i];
26+
ans.push_back(i + 1);
27+
}
28+
}
29+
return ans;
30+
}
31+
};

0 commit comments

Comments
 (0)