File tree Expand file tree Collapse file tree 6 files changed +224
-2
lines changed
solution/1600-1699/1696.Jump Game VI Expand file tree Collapse file tree 6 files changed +224
-2
lines changed Original file line number Diff line number Diff line change 52
52
53
53
<!-- 这里可写通用的实现逻辑 -->
54
54
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
+
55
69
<!-- tabs:start -->
56
70
57
71
### ** Python3**
58
72
59
73
<!-- 这里可写当前语言的特殊实现逻辑 -->
60
74
61
75
``` 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 ]
63
89
```
64
90
65
91
### ** Java**
66
92
67
93
<!-- 这里可写当前语言的特殊实现逻辑 -->
68
94
69
95
``` 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
+ ```
70
137
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
+ }
71
157
```
72
158
73
159
### ** ...**
Original file line number Diff line number Diff line change 51
51
### ** Python3**
52
52
53
53
``` 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 ]
55
67
```
56
68
57
69
### ** Java**
58
70
59
71
``` 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
+ ```
60
113
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
+ }
61
133
```
62
134
63
135
### ** ...**
Original file line number Diff line number Diff line change
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
+ };
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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 ]
You can’t perform that action at this time.
0 commit comments