分析
应用双端队列,构造一个可以动态的求出当前数组最大值的容器,qmax。同上在构造一个qmin。
从left,right等于开始,如果当前区间的qmax-qmin符合条件,right向右扩充,当不符合条件时,计算上一步符合条件的所有子数组个数。个数公式为 left-right。
计算公式是因为当前数组符合条件,那么当前问题的所有子数组肯定也符合条件。因为当前数组当减少一个元素,子数组的max 小于等于 原来的 max , min 大于等于原来的min。故相减结果符合小于等于sum。
计算完毕后,left减右扩展。
int GetNumSum(vector<int>&v, int num)
{
int ret = 0;
deque<int>max;
deque<int>min;
int size = v.size();
int i = 0;
int j = 0;
for (i = 0; i < size; ++i)
{
for (; j < size; ++j)
{
while (!max.empty() && v[max.back()] <= v[j])
max.pop_back();
while (!min.empty() && v[min.back()] >= v[j])
min.pop_back();
max.push_back(j);
min.push_back(j);
if (v[max.front()] - v[min.front()]>num)
break;
++j;
}
ret = j - i + ret;
++i;
}
return ret;
}