博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量...
阅读量:4542 次
发布时间:2019-06-08

本文共 1268 字,大约阅读时间需要 4 分钟。

【题目】

给定数组arr和整数num,共返回有多少个子数组满足如下情况:
max(arr[i.j]) - min(arr[i.j]) <= num max(arfi.j])表示子数组ar[ij]中的最大值,min(arli.j])表示子数组arr[i.j]中的最小值。
【要求】
如果数组长度为N,请实现时间复杂度为O(N)的解法。
【题解】
使用两个单调栈,一个栈维持从大到小的排序,头部永远是最大值
一个维持从小到大的排序,头部永远都是最小值
然后使用窗口进行数据移动
当右移后,最大最小差超过num时,计算这段数组可以组成的子数组数量,因为长数组满足要求,
那么里面的短数组更满足要求,
然后进行左移,是最大最小差满足要求

1 #include 
2 #include
3 #include
4 5 using namespace std; 6 7 int getSubArrayNum(vector
v, int num) 8 { 9 int l, r, res = 0;10 list
maxl, minl;11 for (l=-1,r=0;l
v[maxl.back()]) 14 maxl.pop_back();15 while (!minl.empty() && v[r] < v[minl.back()])16 minl.pop_back();17 maxl.push_back(r);18 minl.push_back(r);19 if (v[maxl.front()] - v[minl.front()] > num)20 res += r - l;21 while(v[maxl.front()] - v[minl.front()] > num)22 {23 ++l;24 if (maxl.front() == l)25 maxl.pop_front();26 if (minl.front() == l)27 minl.pop_front();28 }29 }30 res += r - l;31 return res;32 }33 34 35 int main()36 {37 vector
v = { 8,5,4,6,9,1,4,5,7,8,6,3,4,5,9,8 };38 int num = 4;39 cout << getSubArrayNum(v, num) << endl;40 return 0;41 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11180966.html

你可能感兴趣的文章
Flask Web开发从入门到放弃(一)
查看>>
数组的完全随机排列
查看>>
cuda和显卡驱动版本
查看>>
LeetCode OJ
查看>>
你的焦虑迷茫真的不是因为太懒太闲?
查看>>
Autolayout + VFL(Visual Format Language)
查看>>
通过虚拟驱动vivi分析摄像头驱动
查看>>
【JZOJ100208】【20190705】传说之下
查看>>
面试小记
查看>>
线性代数
查看>>
网页设计
查看>>
批量删除空行
查看>>
Java输入
查看>>
Python-ORM之sqlalchemy的简单使用
查看>>
Preserving Remote IP/Host while proxying
查看>>
跟潭州学院的强子老师学习网络爬虫---爬取全书网
查看>>
bzoj千题计划178:bzoj2425: [HAOI2010]计数
查看>>
[国家集训队2012]middle
查看>>
使用Holer远程桌面登录家里电脑和公司内网电脑
查看>>
Java数组5作业(2015-8-27)
查看>>