窗口问题,子数组中的最大值减最小值小于或等于num
程序1:窗口问题求划过的最大值数组
#include<iostream> //窗口问题求划过的最大值数组,双端队列 using namespace std; #include<string> #include<typeinfo> #include<deque> #include<algorithm> int* getMaxWindow(int*arr,int w,int len) { if(arr==nullptr || w<1 || w>len) { return NULL; } deque<int> qmax; int index = 0; int* res = new int[len-w+1]; for(int i=0;i<len;i++) { while(!qmax.empty()&&arr[qmax.back()]<=arr[i]) { qmax.pop_back(); } qmax.push_back(i); if(qmax.front()==i-w) //过期的位置 { qmax.pop_front(); } if(i>=w-1) { res[index++] = arr[qmax.front()]; } } return res; } int main() { int a[] = {4,3,5,4,3,3,6,7}; int* ret = getMaxWindow(a,3,8); for(int i=0;i<6;i++) { cout<<ret[i]<<endl; } return 0; }
程序2:子数组中的最大值减最小值小于或等于num
#include<iostream> //子数组中的最大值减最小值小于或等于num using namespace std; #include<string> #include<typeinfo> #include<deque> #include<algorithm> int getNum(int *arr,int len,int num) { if(arr==nullptr||len==0) { return 0; } deque<int> qmax; deque<int> qmin; int res=0; int L=0; int R=0; while(L<len) { while(R<len) { while(!qmax.empty()&&arr[R]>=arr[qmax.back()]) { qmax.pop_back(); } qmax.push_back(R); while(!qmin.empty()&&arr[R]<=arr[qmin.back()]) { qmin.pop_back(); } qmin.push_back(R); if(arr[qmax.front()]-arr[qmin.front()] > num) { break; } R++; } if(qmin.front()==L) { qmin.pop_front(); } if(qmax.front()==L) { qmax.pop_front(); } res+=R-L; L++; } return res; } int main() { int a[]={4,5,8}; cout<<getNum(a,3,3); return 0; }