Skip to content

Commit 9b12342

Browse files
committed
feat: add solutions to lc problem: No.1696
No.1696.Jump Game VI
1 parent 46e6dcf commit 9b12342

File tree

6 files changed

+224
-2
lines changed

6 files changed

+224
-2
lines changed

solution/1600-1699/1696.Jump Game VI/README.md

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,108 @@
5252

5353
<!-- 这里可写通用的实现逻辑 -->
5454

55+
**方法一:动态规划 + 单调队列优化**
56+
57+
我们定义 $f[i]$ 表示到达下标 $i$ 的最大得分,那么 $f[i]$ 的值可以从 $f[j]$ 转移而来,其中 $j$ 满足 $i - k \leq j \leq i - 1$。因此我们可以使用动态规划求解。
58+
59+
状态转移方程为:
60+
61+
$$
62+
f[i] = \max_{j \in [i - k, i - 1]} f[j] + nums[i]
63+
$$
64+
65+
我们可以使用单调队列优化状态转移方程,具体做法是维护一个单调递减的队列,队列中存储的是下标 $j$,并且队列中的下标对应的 $f[j]$ 值是单调递减的。在进行状态转移时,我们只需要取出队首的下标 $j$,即可得到 $f[j]$ 的最大值,然后将 $f[i]$ 的值更新为 $f[j] + nums[i]$ 即可。
66+
67+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组的长度。
68+
5569
<!-- tabs:start -->
5670

5771
### **Python3**
5872

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

6175
```python
62-
76+
class Solution:
77+
def maxResult(self, nums: List[int], k: int) -> int:
78+
n = len(nums)
79+
f = [0] * n
80+
q = deque([0])
81+
for i in range(n):
82+
if i - q[0] > k:
83+
q.popleft()
84+
f[i] = nums[i] + f[q[0]]
85+
while q and f[q[-1]] <= f[i]:
86+
q.pop()
87+
q.append(i)
88+
return f[-1]
6389
```
6490

6591
### **Java**
6692

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

6995
```java
96+
class Solution {
97+
public int maxResult(int[] nums, int k) {
98+
int n = nums.length;
99+
int[] f = new int[n];
100+
Deque<Integer> q = new ArrayDeque<>();
101+
q.offer(0);
102+
for (int i = 0; i < n; ++i) {
103+
if (i - q.peekFirst() > k) {
104+
q.pollFirst();
105+
}
106+
f[i] = nums[i] + f[q.peekFirst()];
107+
while (!q.isEmpty() && f[q.peekLast()] <= f[i]) {
108+
q.pollLast();
109+
}
110+
q.offerLast(i);
111+
}
112+
return f[n - 1];
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
int maxResult(vector<int>& nums, int k) {
123+
int n = nums.size();
124+
int f[n];
125+
f[0] = 0;
126+
deque<int> q = {0};
127+
for (int i = 0; i < n; ++i) {
128+
if (i - q.front() > k) q.pop_front();
129+
f[i] = nums[i] + f[q.front()];
130+
while (!q.empty() && f[q.back()] <= f[i]) q.pop_back();
131+
q.push_back(i);
132+
}
133+
return f[n - 1];
134+
}
135+
};
136+
```
70137
138+
### **Go**
139+
140+
```go
141+
func maxResult(nums []int, k int) int {
142+
n := len(nums)
143+
f := make([]int, n)
144+
q := []int{0}
145+
for i, v := range nums {
146+
if i-q[0] > k {
147+
q = q[1:]
148+
}
149+
f[i] = v + f[q[0]]
150+
for len(q) > 0 && f[q[len(q)-1]] <= f[i] {
151+
q = q[:len(q)-1]
152+
}
153+
q = append(q, i)
154+
}
155+
return f[n-1]
156+
}
71157
```
72158

73159
### **...**

solution/1600-1699/1696.Jump Game VI/README_EN.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,85 @@
5151
### **Python3**
5252

5353
```python
54-
54+
class Solution:
55+
def maxResult(self, nums: List[int], k: int) -> int:
56+
n = len(nums)
57+
f = [0] * n
58+
q = deque([0])
59+
for i in range(n):
60+
if i - q[0] > k:
61+
q.popleft()
62+
f[i] = nums[i] + f[q[0]]
63+
while q and f[q[-1]] <= f[i]:
64+
q.pop()
65+
q.append(i)
66+
return f[-1]
5567
```
5668

5769
### **Java**
5870

5971
```java
72+
class Solution {
73+
public int maxResult(int[] nums, int k) {
74+
int n = nums.length;
75+
int[] f = new int[n];
76+
Deque<Integer> q = new ArrayDeque<>();
77+
q.offer(0);
78+
for (int i = 0; i < n; ++i) {
79+
if (i - q.peekFirst() > k) {
80+
q.pollFirst();
81+
}
82+
f[i] = nums[i] + f[q.peekFirst()];
83+
while (!q.isEmpty() && f[q.peekLast()] <= f[i]) {
84+
q.pollLast();
85+
}
86+
q.offerLast(i);
87+
}
88+
return f[n - 1];
89+
}
90+
}
91+
```
92+
93+
### **C++**
94+
95+
```cpp
96+
class Solution {
97+
public:
98+
int maxResult(vector<int>& nums, int k) {
99+
int n = nums.size();
100+
int f[n];
101+
f[0] = 0;
102+
deque<int> q = {0};
103+
for (int i = 0; i < n; ++i) {
104+
if (i - q.front() > k) q.pop_front();
105+
f[i] = nums[i] + f[q.front()];
106+
while (!q.empty() && f[q.back()] <= f[i]) q.pop_back();
107+
q.push_back(i);
108+
}
109+
return f[n - 1];
110+
}
111+
};
112+
```
60113
114+
### **Go**
115+
116+
```go
117+
func maxResult(nums []int, k int) int {
118+
n := len(nums)
119+
f := make([]int, n)
120+
q := []int{0}
121+
for i, v := range nums {
122+
if i-q[0] > k {
123+
q = q[1:]
124+
}
125+
f[i] = v + f[q[0]]
126+
for len(q) > 0 && f[q[len(q)-1]] <= f[i] {
127+
q = q[:len(q)-1]
128+
}
129+
q = append(q, i)
130+
}
131+
return f[n-1]
132+
}
61133
```
62134

63135
### **...**
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public:
3+
int maxResult(vector<int>& nums, int k) {
4+
int n = nums.size();
5+
int f[n];
6+
f[0] = 0;
7+
deque<int> q = {0};
8+
for (int i = 0; i < n; ++i) {
9+
if (i - q.front() > k) q.pop_front();
10+
f[i] = nums[i] + f[q.front()];
11+
while (!q.empty() && f[q.back()] <= f[i]) q.pop_back();
12+
q.push_back(i);
13+
}
14+
return f[n - 1];
15+
}
16+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
func maxResult(nums []int, k int) int {
2+
n := len(nums)
3+
f := make([]int, n)
4+
q := []int{0}
5+
for i, v := range nums {
6+
if i-q[0] > k {
7+
q = q[1:]
8+
}
9+
f[i] = v + f[q[0]]
10+
for len(q) > 0 && f[q[len(q)-1]] <= f[i] {
11+
q = q[:len(q)-1]
12+
}
13+
q = append(q, i)
14+
}
15+
return f[n-1]
16+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public int maxResult(int[] nums, int k) {
3+
int n = nums.length;
4+
int[] f = new int[n];
5+
Deque<Integer> q = new ArrayDeque<>();
6+
q.offer(0);
7+
for (int i = 0; i < n; ++i) {
8+
if (i - q.peekFirst() > k) {
9+
q.pollFirst();
10+
}
11+
f[i] = nums[i] + f[q.peekFirst()];
12+
while (!q.isEmpty() && f[q.peekLast()] <= f[i]) {
13+
q.pollLast();
14+
}
15+
q.offerLast(i);
16+
}
17+
return f[n - 1];
18+
}
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def maxResult(self, nums: List[int], k: int) -> int:
3+
n = len(nums)
4+
f = [0] * n
5+
q = deque([0])
6+
for i in range(n):
7+
if i - q[0] > k:
8+
q.popleft()
9+
f[i] = nums[i] + f[q[0]]
10+
while q and f[q[-1]] <= f[i]:
11+
q.pop()
12+
q.append(i)
13+
return f[-1]

0 commit comments

Comments
 (0)