剑指offer:滑动窗口的最大值
2016-04-02 19:46
316 查看
//题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如, // 如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们 // 的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: // {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, // {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。 //思路描述:扫描给定的数组,用一个大小为size的堆维护,将这次的元素加入堆中,找出其中的最大值 // 然后利用first指针指向滑动窗口的最前端,下次滑动窗口移动时,first将不在这个窗口内 // 故将其从这个堆中删除。考虑到可能有重复元素所以用map<num数组中的值,num数组中出现的次数>来维护这个堆 // map的begin元素是最小元素,rbegin是最大元素。 #include "stdafx.h" #include"vector" #include"map" using namespace std; vector<int> maxInWindows(const vector<int>& num, unsigned int size) { int N = num.size(); vector<int> temp; if (N == 0 || size <= 0) return temp; //处理边界情况 int i, j; map<int, int> ma; //map维护一个堆(map是红黑树,rbegin是他的最大元素) int first; int last; for (i = 0; i<size - 1; i++) ma[num[i]]++; //将第一个窗口的树加入树中 for (first = 0, last = size - 1; last<N; last++, first++) { //frist这次即将失效的元素,last当前元素 ma[num[last]]++; temp.push_back(ma.rbegin()->first); ma[num[first]]--; //可能有重复元素,所以这次失效只是把这个元素出现的次数减一 if (ma[num[first]] == 0) //当这次失效的元素出现次数为0时,意味着下个窗口没有这个元素了 ma.erase(num[first]); //将失效元素删除 } return temp; } int main() { vector<int> v = { 2,3,4,2,6,2,5,1 }; vector<int> temp = maxInWindows(v, 3); return 0; }
相关文章推荐
- cubic-bezier贝塞尔曲线CSS3动画工具
- 【JQuery】animate()
- SSH中的Invalid action class configuration that references an unknown class named.......
- 【笔记】 《js权威指南》- 第6章 对象 - 6.2 - 6.4 属性操作1
- javaScript树形结构
- leetcode---Remove Nth Node From End of List
- js中for in 和 for each in的使用
- js设计模式-组合模式
- Chrome 插件JSONView改变风格
- js设计模式-桥接模式
- 【笔记】 《js权威指南》- 第6章 对象 - 6.1 创建对象
- js笔记(8)之数组篇
- jsp导入包的时候要写的规范
- jQuery基础知识第二部分
- JavaScript代码模块化的正规方法
- 【JQuery】使用fadeTo()方法设置淡入淡出效果的不透明度
- Everyone is differnet
- 慕课网-前端课程学习完成
- HTML基本标签使用
- 【剑指 offer】(48)—— 不能被继承的类