给定一个整数数组nums和一个整数K ,任务是找到数组的一个非空子序列的最大和,使得对于子序列中每两个连续的整数,nums[i] 和 nums[j],其中i < j ,满足条件j – i <= K。
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.
例子:
Input: nums = [10, 2, -10, 5, 20], K = 2
Output: 37
Explanation:
The subsequence is [10, 2, 5, 20].
Input: nums = [-1, -2, -3], K = 1
Output: -1
Input: nums = [10, -2, -10, -5, 20], K = 2
Output: 23
方法:
- 这个问题的最优解可以通过使用滑动窗口最大值来实现。
- 对于每个索引,检查可以从它之前的大小为 K 的窗口中获得的最大值是多少。如果最大值为负,请改用零。
CPP
// C++ program to find the maximum sum
// subsequence under given constraint
#include
using namespace std;
// Function return the maximum sum
int ConstrainedSubsetSum(vector& nums,
int k)
{
deque > d;
// Iterating the given array
for (int i = 0; i < nums.size(); i++)
{
// Check if deque is empty
nums[i] += d.size()
? max(d.back().first, 0) : 0;
while (d.size() &&
d.front().first < nums[i])
d.pop_front();
d.push_front({ nums[i], i });
if (d.back().second == i - k)
d.pop_back();
}
int ans = nums[0];
for (auto x : nums)
ans = max(ans, x);
return ans;
}
// Driver code
int main()
{
vector nums = { 10, -2, -10,
-5, 20 };
int K = 2;
// Function call
cout << ConstrainedSubsetSum(nums, K)
<< endl;
return 0;
}
输出:
23
时间复杂度: O(N)
空间复杂度: O(K)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live