剑指offer:滑动窗口的最大值
滑动窗口的最大值
题目描述
#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:滑动窗口的最大值的更多相关文章
- 剑指offer——滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6, ...
- 剑指0ffer59.滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...
- 剑指offer64:滑动窗口的最大值
题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4, ...
- 剑指offer--50.滑动窗口的最大值
时间限制:1秒 空间限制:32768K 热度指数:157641 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的 ...
- 【Java】 剑指offer(59-2) 队列的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请定义一个队列并实现函数max得到队列里的最大值,要求函数ma ...
- 剑指Offer-滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- [剑指Offer]59-队列的最大值(题目二待补)
题目一:滑动窗口的最大值 题目链接 https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqI ...
- 剑指offer——68队列的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- 剑指offer——69队列的最大值
题目: 队列的最大值.请定义一个队列并实现函数max得到队列里的最大值,要求函数max.push_back和pop_front的时间复杂度都是O(1). 题解: 使用队列,操持队列的排序为从大到小的顺 ...
- 剑指offer 59-II 队列的最大值
题目描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_ ...
随机推荐
- 20145236《网络对抗》Exp8 WEB基础实践
20145236<网路对抗>Exp8 WEB基础实践 一.基础问题回答 什么是表单 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框. ...
- 深入浅出的webpack构建工具--webpack4+vue搭建环境 (十三)
深入浅出的webpack构建工具--webpack4+vue搭建环境 (十三) 从上面一系列的webpack配置的学习,我们现在来使用webpack来搭建vue的开发环境.首先我们来设想下我们的项目的 ...
- Winform 基础一 panel
一 居上.居中.居下 二 添加子控件 三 适应不同分辨率 四 内容超出,显示滚动条 一 .居上.居中.居下 二.添加子页面 Form7 childFrm = new Form7(); childFrm ...
- Luogu P2700 逐个击破
qwq 同关押罪犯 对于这种希望几个对象分开的题目,只要把并查集反过来想就可以了. 既然要求删除的边权最小,那么只要反过来求给定的点不连通时保留的边权最大即为正解. 同样的,首先将边权排序,不会使敌人 ...
- java语言基础1问题汇总
1.一个Java类文件中真的只能有一个公有类吗? 程序实验: public class test1 { public static void main( String args[] ){ } publ ...
- 微软被传证实收购 GitHub
GitHub 是一个庞大的代码库,已经有越来越多的公司使用这个网站来共享和查看代码,其中不乏苹果.亚马逊.谷歌等大型科技公司.微软则是该网站的最大贡献者,并有超过 1000 名员工长期地将代码推送到 ...
- 办公室的远程传文件 的命令三种方式linux
不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是 ...
- Spring Extensible XML
Spring框架从2.0版本开始,提供了基于Schema风格的Spring XML格式用来定义bean的扩展机制.引入Schema-based XML是为了对Traditional的XML配置形式进行 ...
- [转]The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
完整错误信息: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"AS IS" AND ANY ...
- Luogu P3374 【模板】树状数组 1
真正的模板题. 树状数组的思想很简单(不如说背代码更简单),每个节点记录多个节点的信息(每个点存x&(-x)个). 道理可以参见很多大佬的博客,最后前缀和的思想搞一下就好了.不想说也不会说. ...