剑指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]}。
代码如下:
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> res; if(num.size()==0 || size==0 || size >= num.size()) return res; if(size <= num.size() && size >= 1){ vector<int>::const_iterator it=num.begin(); while( (it+size) != (num.end()+1) ){ vector<int> temp(it,it+size); sort(temp.begin(),temp.end()); res.push_back(temp[size-1]); ++it; } return res; } } int main(){ vector<int> num; num.push_back(2); num.push_back(3); num.push_back(4); num.push_back(2); num.push_back(6); num.push_back(2); num.push_back(5); num.push_back(1); vector<int> res1=maxInWindows(num,3); for(int i=0;i<res1.size();i++){ cout<<res1[i]<<endl; } vector<int> num1; num1.push_back(2); num1.push_back(3); num1.push_back(4); num1.push_back(2); num1.push_back(6); num1.push_back(2); num1.push_back(5); num1.push_back(1); vector<int> res2=maxInWindows(num,9); for(int i=0;i<res2.size();i++){ cout<<res2[i]<<endl; } }
注意:之前在定义迭代器时,没有使用常量迭代器报错:error: conversion from 'std::vector<int>::const_iterator {aka __gnu_cxx::__normal_iterator<const int*, std::vector<int> >}' to non-scalar type 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' requested
const_iterator 对象可以用于const vector 或非 const vector,它自身的值可以改(可以指向其他元素),但不能改写其指向的元素值.
具体分析可参照:http://www.cnblogs.com/greatverve/archive/2012/09/12/const-iterator.html
此题解法2:
class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { /* * 思路:滑动窗口应当是队列,但为了得到滑动窗口的最大值,队列可以从两端删除元素,因此使用双端队列。 而且它用来保存有可能是华东窗口最大值的数字的下标 * 原则: * 对新来的元素,将其与双端队列中的元素相比较 * 1)如果已有数字小于待存入数字,直接移出队列(因为不再可能成为后面滑动窗口的最大值了!), * 2)比较下标,判断队列头部的数字是否已不在窗口之内,不在了,直接移出队列 * 队列的第一个元素(下标)对应值是滑动窗口中的最大值 */ vector<int> res; if(num.size() >= size && size >= 1){ deque<int> index; for(unsigned int i=0;i<size;i++){ while(!index.empty() && num[i] >= num[index.back()]) index.pop_back(); index.push_back(i); } for(unsigned int i=size;i<num.size();i++){ res.push_back(num[index.front()]); while(!index.empty() && num[i] >= num[index.back()]) index.pop_back(); if(!index.empty() && index.front() <= (i-size)) index.pop_front(); index.push_back(i); } res.push_back(num[index.front()]); } return res; } };
朱颜辞镜花辞树,敏捷开发靠得住!