滑动窗口的最大值

题目描述

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

剑指offer:滑动窗口的最大值的更多相关文章

  1. 剑指offer——滑动窗口的最大值

    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6, ...

  2. 剑指0ffer59.滑动窗口的最大值

    给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...

  3. 剑指offer64:滑动窗口的最大值

    题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4, ...

  4. 剑指offer--50.滑动窗口的最大值

    时间限制:1秒 空间限制:32768K 热度指数:157641 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的 ...

  5. 【Java】 剑指offer(59-2) 队列的最大值

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请定义一个队列并实现函数max得到队列里的最大值,要求函数ma ...

  6. 剑指Offer-滑动窗口的最大值

    题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  7. [剑指Offer]59-队列的最大值(题目二待补)

    题目一:滑动窗口的最大值 题目链接 https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqI ...

  8. 剑指offer——68队列的最大值

    题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  9. 剑指offer——69队列的最大值

    题目: 队列的最大值.请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和pop_front的时间复杂度都是O(1). 题解: 使用队列,操持队列的排序为从大到小的顺 ...

  10. 剑指offer 59-II 队列的最大值

    题目描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_ ...

随机推荐

  1. metamask中的import account的代码实现

    metamask-extension/app/scripts/account-import-strategies/index.js 这部分就是用户如果往metamask中import一个已有的账户调用 ...

  2. strcat、num2str

    文章出处: http://blog.sina.com.cn/s/blog_6fb8aa0d01019id5.html http://wenda.so.com/q/1439143662729624 ht ...

  3. exBSGS·BSGS-Senior/扩展的BSGS

    \(\rm{0x01\quad Preface}\) \(emmm\)严格来讲,不应该被算到一个模板里面.因为在我看来模板是人构造出来的,但是这个算法应该是一个解决问题的\(process\)-更像是 ...

  4. 使用Android SDK Manager下载sdk时总是出现中断异常的解决办法。

    1.搜到到你本机的hosts文件. 2.打开该文件. 3.在该文件最后一行添加:74.125.31.136 dl-ssl.google.com 4.重新下载问题解决. 参考链接:http://bbs. ...

  5. 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute (转载)

    ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的,所以文章提到了cor ...

  6. 外部Jenkins调用容器中Slave配置实践

    1.Jenkins配置 实现动态生成的Slave节点并调用,解决构建项目出现slave节点任务堵塞或者是slave宕机问题.容器平台采用openshift. 参考配置文档:https://blog.c ...

  7. 实现Repeater控件的记录单选(二)

    前一篇<实现Repeater控件的记录单选>http://www.cnblogs.com/insus/p/7426334.html 虽然可以实现对Repeater控件的记录进行单选,但是, ...

  8. 使用Hexo+Github搭建属于自己的博客(基础)

    前言 hexo是一个台湾人做的基于Node.js的静态博客程序,优势是生成静态文件的速度非常快,支持markdown, 我最终选定它的原因是它速度快而且不容易出错,并且可以一键部署到github或者其 ...

  9. 手机H5移动端WEB资源整合之meta标签

    一.相关网站使用meta的实例 youku首页的Meta设置: <meta charset="utf-8"> <meta http-equiv="X-U ...

  10. git bash返回上一级目录

    YITU-LIUMZ+Administrator@yitu-liumz MINGW64 ~/learngit/gitskills (dev)$ cd ..\ 注意 cd 后面有空格 然后就会弹出一个 ...