1696. Jump Game VI
https://leetcode.com/problems/jump-game-vi/
You are given a 0-indexed integer array nums
and an integer k
.
You are initially standing at index 0
. In one move, you can jump at most k
steps forward without going outside the boundaries of the array. That is, you can jump from index i
to any index in the range [i + 1, min(n - 1, i + k)]
inclusive.
You want to reach the last index of the array (index n - 1
). Your score is the sum of all nums[j]
for each index j
you visited in the array.
Return the maximum score you can get.
Example 1:
Input: nums = [1,-1,-2,4,-7,3], k = 2
Output: 7
Explanation: You can choose your jumps forming the subsequence [1,-1,4,3] (underlined above). The sum is 7.
Example 2:
Input: nums = [10,-5,-2,4,0,3], k = 3
Output: 17
Explanation: You can choose your jumps forming the subsequence [10,4,3] (underlined above). The sum is 17.
Example 3:
Input: nums = [1,-5,-20,4,-1,3,-6,-3], k = 2
Output: 0
Constraints:
1 <= nums.length, k <= 105
-104 <= nums[i] <= 104
给定数组nums,从第一个元素开始,每次能往前最远跳k步且收益为所跳到格子的值,问跳到最后一个位置时最大的收益是多少。虽然有一点不同,但思路基本和1425. Constrained Subsequence Sum一致:subseq + argmax => dp[i] == 此时最大序列和:argmax(dp[i - k], dp[i -k +1], ... dp[i - 1]) + nums[i]。找max(dp[i - k: i - 1])的过程相当于维持一个大小为k的在dp数组上的滑动窗口,且每次找窗口内最大元素=>单调栈。和1425区别在于必须从起点跳到终点,因此结果不再是max(dp)而是dp[-1],且dp[i - k: i - 1]必须要选一个,而不能因为是负数而不选。
class Solution:
def maxResult(self, nums: List[int], k: int) -> int:
N = len(nums)
dp, q = [0] * N, deque([nums[0]])
dp[0] = nums[0]
for i in range(1, N):
f = i - k
r = q[0] + nums[i]
dp[i] = r
if f >= 0 and dp[f] == q[0]:
q.popleft()
while q and r > q[-1]:
q.pop()
q.append(r)
return dp[-1]
Last updated
Was this helpful?