剑指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_ ...
随机推荐
- PCB (2)创建新工程原理图
1创建一个新项目 2创建一个新的原理图图纸 3将原理图图纸添加到项目 4设置原理图选项 修改单位 设置图纸大小 图纸附加说明 5绘制原理图 打开库 之后连续放置的器件会在此基础上+1 名字 描述 6 ...
- 20145203盖泽双 《网络对抗技术》实践1—— MAL_逆向与Bof基础
20145203盖泽双 <网络对抗技术> MAL_逆向与Bof基础 实践目标 (1)我们要通过修改程序代码,使得程序运行其自身中本不该运行的代码片段. (2)在这里,我们有一个名为2014 ...
- 20145236《网络攻防》Exp4 恶意代码分析
20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...
- mybatis的批量更新实例
近来批量添加,删除,更新用的比较多,单一的删除和更新,操作无法满足企业某些业务的需求,故通过以下示例分享知识: 今天通过更新的例子来说明 演示环境为jdk8,maven环境,ssm框架 请准备好环境, ...
- Git-本地项目和远程项目关联
此处记录将本地项目与码云仓库关联步骤 1. 本地 Git 配置 配置一下一些基本的信息 $ git config--global user.name "Your Name" $ g ...
- Luogu P1082 同余方程(exgcd模版)
传送门 求ax%b = 1,即ax - by = 1: 很明显这是一个exgcd的形式. 那么要做这道题,首先需要gcd和exgcd的算法作铺垫. gcd(辗转相膜法): int gcd(int a, ...
- AIS系统(转)
船舶自动识别系统(Automatic Identification System, 简称AIS系统)由岸基(基站)设施和船载设备共同组成,是一种新型的集网络技术.现代通讯技术.计算机技术.电子信息显示 ...
- LVDS时序分析
LVDS时序分析 2012年05月07日 11:48:08 Walle 阅读数:3355 标签: 平台工作 最近在调试基于telechip平台的LVDS驱动,一开始对该平台的LVDS时序不是很了解 ...
- python棋类游戏编写入门
刚接触棋类游戏程序编写的朋友,往往比较迷惑,不知从何下手. 本文总结了棋类游戏的主程序流程.计算机走子策略.打分方式(以井字棋.黑白棋.五子棋为例),未使用minimax算法,比较简单,适合刚接触的朋 ...
- 关于LCA
LCA:最近公共祖先 指在有根树中,找出某两个结点u和v最近的公共祖先 如图,5,7的最近公共祖先就是3 接下来,我们来了解如何求解LCA No.1 暴力 首先想到的肯定是暴力,我们搜索,从两个节点一 ...