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
