C ++中绝对差小于或等于限制的最长连续子数组

假设我们有一个称为nums的整数数组和一个整数限制,我们必须找到最长的非空子数组的大小,以使该子数组的任何两项之间的绝对差小于或等于给定的限制。

因此,如果输入类似于nums = [8,2,4,7],limit = 4,则输出将为2,这是因为-

  • [8]如此| 8-8 | = 0 <= 4。

  • [8,2]如此| 8-2 | = 6> 4。

  • [8,2,4]如此| 8-2 | = 6> 4。

  • [8,2,4,7]如此| 8-2 | = 6> 4。

  • [2]如此| 2-2 | = 0 <= 4。

  • [2,4]如此| 2-4 | = 2 <= 4。

  • [2,4,7]如此| 2-7 | = 5> 4。

  • [4]如此| 4-4 | = 0 <= 4。

  • [4,7]如此| 4-7 | = 3 <= 4。

  • [7]如此| 7-7 | = 0 <= 4。

最后,最长子数组的大小为2。

为了解决这个问题,我们将遵循以下步骤-

  • ret:= 0,i:= 0,j:= 0

  • 定义一个双端队列maxD和另一个双端队列minD

  • n:= nums的大小

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 如果nums [j]与maxD的第一个元素相同,则-

    • 如果nums [j]与minD的第一个元素相同,则-

    • (将j增加1)

    • 从maxD删除前元素

    • 从minD删除前元素

    • 从minD删除最后一个元素

    • 从maxD删除最后一个元素

    • while(不是maxD为空,并且maxD <nums [i]的最后一个元素),执行-

    • 而(非minD为空,minD的最后一个元素> nums [i]),则执行-

    • 在maxD的末尾插入nums [i]

    • 在minD的末尾插入nums [i]

    • while(maxD的第一个元素-minD的第一个元素)> k,执行-

    • ret:= ret的最大值和(i-j + 1)

    • 返回ret

    例 

    让我们看下面的实现以更好地理解-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int longestSubarray(vector<int>& nums, int k) {
          int ret = 0;
          int i = 0;
          int j = 0;
          deque<int> maxD;
          deque<int> minD;
          int n = nums.size();
          for (int i = 0; i < n; i++) {
             while (!maxD.empty() && maxD.back() < nums[i])
                maxD.pop_back();
             while (!minD.empty() && minD.back() > nums[i])
                minD.pop_back();
             maxD.push_back(nums[i]);
             minD.push_back(nums[i]);
             while (maxD.front() - minD.front() > k) {
                if (nums[j] == maxD.front())
                   maxD.pop_front();
                if (nums[j] == minD.front())
                   minD.pop_front();
                j++;
             }
             ret = max(ret, i - j + 1);
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {7,8,2,4};
       cout << (ob.longestSubarray(v, 4));
    }

    输入值

    {7,8,2,4}, 4

    输出结果

    2