数据结构和算法经典100题-第33题
2016-01-03 15:28
459 查看
最大值减去最小值小于或等于num的子数组的数量
题目要求:
给定数组srr和整数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)的算法
题目解析:
看此题前请看一下上一题33题。
因为发现木有啥人在看,所以直接给出代码了:
no code say what:
路漫漫其修远兮,吾将上下而求索…
题目要求:
给定数组srr和整数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)的算法
题目解析:
看此题前请看一下上一题33题。
因为发现木有啥人在看,所以直接给出代码了:
no code say what:
int getNum(const vector<int> &arr, const int num) { if (arr.empty() || 0 >= num ) { return -1; } int i = 0; int j = 0; int res = 0; deque<int> qmax; deque<int> qmin; int len = (int)arr.size(); while (i < len) { while (j < len) { while (!qmin.empty() && arr[qmin.back()] > arr[j]) { qmin.pop_back(); } qmin.push_back(j); while (!qmax.empty() && arr[qmax.back()] < arr[j]) { qmax.pop_back(); } qmax.push_back(j); if (arr[qmax.front()] - arr[qmin.front()] < num) { break; } j++; } if (qmax.front() == i) { qmax.pop_front(); } if (qmin.front() == i) { qmin.pop_front(); } res += j - i; i++; } return res; }
路漫漫其修远兮,吾将上下而求索…
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法