滑动窗口求满足的子数组个数

题目:

给定数组arr和整数num,返回有多少个子数组满足如下情况:
max(arr[i..j]) - min(arr[i..j]) <= num
max(arr[i..j])表示子数组arr[i..j]中的最大值,min(arr[i..j])表示子数组arr[i..j]中的最小值。
如果数组长度为 N,请实现时间复杂度为 O(N)的解法。


解题思路:


有两个定理:

1、若数组的max-min<=k,则子数组中max-min<=k成立

2、若数组的max-min<=k不成立,则子数组中max-min<=k不成立



C++程序;]

#include<iostream>
#include<stdlib.h>
#include<deque>
using namespace std;


int fun(int* a,int length,int num)
{
deque<int> minque,maxque;
int left=0,right=0;
int count=0;
while(left<length)
{
while(right<length)
{
while(!minque.empty()&&a[right]<=a[minque.back()])
minque.pop_back();
minque.push_back(right);


while(!maxque.empty()&&a[right]>=a[maxque.back()])
maxque.pop_back();
maxque.push_back(right);


if(a[maxque.front()]-a[minque.front()]>num)
break;
right++;


}


if(left==maxque.front())
maxque.pop_front();


if(left==minque.front())
minque.pop_front();


count+=right-left;


left++;


}
return count;
}
int main()
{
int a[]= {7, 9, 6, 1, 0,
                  7, 5, 4, 4, 4,
                  2, 0, 7, 1, 7,
                  2, 5, 3, 1, 9,
                  0, 8, 8, 9, 4,
 2, 3, 6, 9, 8};
   int length=sizeof(a)/sizeof(a[0]);


cout<<fun(a, length, 5)<<endl;


system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值