由于之前看了牛客网的数据结构和算法的课程知道了左神,现在找到了这本书当作入门书做做吧,虽然书的题解都是java实现的,但好在用c++实现难度不大。
第一章 栈和队列
题目一:最大值减去最小值小于或等于num的子数组数量
//! @file findTheNumberOfMaxreduceMinLOETnum.cpp
//! @author 鶸.
//! @date 2019/4/3
//! @brief 1、如果子数组arr[i…j]满足条件,那么arr[i…j]中的子数组一定也满足条件。
// 2、如果子数组arr[i…j]不满足条件,那么包含arr[i…j]的子数组一定也不满足条件。
// 3、用双端队列来维护max和min的更新,详细可以看我之前的"生成窗口最大值数组"问题
#include "stdafx.h"
#include <deque>
#include <iostream>
#include <vector>
using namespace std;
int getTheNumber(vector<int> arr,int num){
deque<int> max,min;int number=0,i=0,j=0;//由题意得,i和j在两个for循环之前定义便于计算number
for (;i<arr.size();++i)
{
for (;j<arr.size();++j)
{
while(!max.empty()&&arr[max.back()]<=arr[j])
max.pop_back();
max.push_back(j);
while(!min.empty()&&arr[min.back()]>=arr[j])
min.pop_back();
min.push_back(j);
if ((max.front()-min.front())>num)
{
break;
}
}
//如果j=i则不是数组了
number+=j-i;
//双端队列的好处
if (max.front()==i)
{
max.pop_front();
}
if (min.front()==i)
{
min.pop_front();
}
}
return number;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> a;
a.push_back(3);
a.push_back(2);
a.push_back(5);
a.push_back(1);
a.push_back(4);
a.push_back(7);
a.push_back(8);
a.push_back(6);
cout<<getTheNumber(a,4);
return 0;
}