原文链接: https://leetcode-cn.com/problems/constrained-subsequence-sum
英文原文
Given an integer array nums
and an integer k
, return the maximum sum of a non-empty subsequence of that array such that for every two consecutive integers in the subsequence, nums[i]
and nums[j]
, where i < j
, the condition j - i <= k
is satisfied.
A subsequence of an array is obtained by deleting some number of elements (can be zero) from the array, leaving the remaining elements in their original order.
Example 1:
Input: nums = [10,2,-10,5,20], k = 2 Output: 37 Explanation: The subsequence is [10, 2, 5, 20].
Example 2:
Input: nums = [-1,-2,-3], k = 1 Output: -1 Explanation: The subsequence must be non-empty, so we choose the largest number.
Example 3:
Input: nums = [10,-2,-10,-5,20], k = 2 Output: 23 Explanation: The subsequence is [10, -2, -5, 20].
Constraints:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
中文题目
给你一个整数数组 nums
和一个整数 k
,请你返回 非空 子序列元素和的最大值,子序列需要满足:子序列中每两个 相邻 的整数 nums[i]
和 nums[j]
,它们在原数组中的下标 i
和 j
满足 i < j
且 j - i <= k
。
数组的子序列定义为:将数组中的若干个数字删除(可以删除 0 个数字),剩下的数字按照原本的顺序排布。
示例 1:
输入:nums = [10,2,-10,5,20], k = 2 输出:37 解释:子序列为 [10, 2, 5, 20] 。
示例 2:
输入:nums = [-1,-2,-3], k = 1 输出:-1 解释:子序列必须是非空的,所以我们选择最大的数字。
示例 3:
输入:nums = [10,-2,-10,-5,20], k = 2 输出:23 解释:子序列为 [10, -2, -5, 20] 。
提示:
1 <= k <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
通过代码
高赞题解
解题思路
定义状态dp[i]
为以i
结尾的的最大子序和,那么当考虑第i+1
个的时候,由于相邻两个下标差距不大于k且非空,所以有以下状态转移方程
$$dp[i+1] = max(nums[i+1], dp[i+1-j] + nums[i+1])$$
$$ for 1 <= j <= k $$
如果使用蛮力法的话,时间复杂度$O(nk)$,会超时。所以需要优化。
由于当前时刻只依赖于前k个时刻的状态,所以快速找到前k
个状态中的最大的即可。这个时候联想到滑动窗口最大的题目。
使用单调栈来进行优化,最终的时间复杂度为$O(n)$
谢谢 @zerotrac2的提醒,已改成双端队列
代码
from collections import deque
class Solution:
def constrainedSubsetSum(self, nums: List[int], k: int) -> int:
n = len(nums)
dp = nums[:]
dp[0] = nums[0]
res = nums[0]
s = deque()
s.append((nums[0], 0))
for i in range(1, len(nums)):
dp[i] = max(dp[i], s[0][0] + nums[i])
while s and s[-1][0] <= dp[i]:
s.pop()
s.append((dp[i], i))
if s[0][1] <= i - k:
s.popleft()
res = max(res, dp[i])
return res
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
3376 | 7616 | 44.3% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|