您的位置:首页 > Web前端

剑指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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: