📌  相关文章
📜  根据给定条件找到最大子序列总和

📅  最后修改于: 2021-09-06 06:50:54             🧑  作者: Mango

给定一个整数数组nums和一个整数K ,任务是找到数组的一个非空子序列的最大和,使得对于子序列中每两个连续的整数,nums[i] 和 nums[j],其中i < j ,满足条件j – i <= K。

例子:

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