剑指offer:滑动窗口的最大值

//题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,
//         如果输入数组{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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值