1 题目描述

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

2 思路和方法

  (1)使用int max_number =*max_element(num.begin()+i,num.begin()+size+i);语句找到最大值,int count = num.size()-size+1;  vector<int> result;   result. push_back(max_number)。

  (2)用一个双端队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次。a.判断当前最大值是否失效,即不在滑动窗口内;b.新增加的值从队尾开始比较,把所有比他小的值丢掉。

  

3 C++核心

(1)

 class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
int count = num.size()-size+;
vector<int> result;
if(size== || num.size()==){
return result;
}
for(int i =;i<count;i++){
int max_number = *max_element(num.begin()+i,num.begin()+size+i);
result.push_back(max_number);
}
return result;
}
};

(2)

 class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> resu;
if (num.size() >= size && size >= ) {
deque<int> numDeque;
//首先把前size个数按照规则压入双向队列
for (int i = ; i != size; i++) {
while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
numDeque.pop_back(); //后面加入的数据大于队列中的数据时,队列中的数据依次弹出
}
numDeque.push_back(i);
}
//压入第一个最大值
//滑动窗口的最大值总是位于双向队列的头部
resu.push_back(num[numDeque.front()]);
for (int i = size; i != num.size(); i++) {
//首先按照规则压入新的值
while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
numDeque.pop_back(); //后面加入的数据大于队列中的数据时,队列中的数据依次弹出
}
//并且删除旧值,即滑出了窗口的值
if (!numDeque.empty() && numDeque.front() <= static_cast<int>(i - size)) {
numDeque.pop_front();
}
numDeque.push_back(i);
resu.push_back(num[numDeque.front()]);
}
}
return resu;
}
};

4 C++完整代码

 #include <iostream>
#include <vector>
#include <deque>
using namespace std;
vector<int> maxInWindows(const vector<int>& num, unsigned int size);
int main() {
vector<int> data{ , , , , , , , };
vector<int> resu = maxInWindows(data, );
for (auto a : resu) {
cout << a << endl;
}
system("pause");
return ;
}
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> resu;
if (num.size() >= size && size >= ) {
deque<int> numDeque;
//首先把前size个数按照规则压入双向队列
for (int i = ; i != size; i++) {
while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
numDeque.pop_back();
}
numDeque.push_back(i);
}
//压入第一个最大值
//滑动窗口的最大值总是位于双向队列的头部
resu.push_back(num[numDeque.front()]);
for (int i = size; i != num.size(); i++) {
//首先按照规则压入新的值
while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
numDeque.pop_back();
}
//并且删除旧值,即滑出了窗口的值
if (!numDeque.empty() && numDeque.front() <= static_cast<int>(i - size)) {
numDeque.pop_front();
}
numDeque.push_back(i);
resu.push_back(num[numDeque.front()]);
}
}
return resu;
}

参考资料

https://blog.csdn.net/u012477435/article/details/83351659#_1782(1)

https://blog.csdn.net/qq_43502142/article/details/87894236(图解)

https://blog.csdn.net/qq_37466121/article/details/88410390,https://blog.csdn.net/qq_43502142/article/details/87894236,https://blog.csdn.net/zjwreal/article/details/89295109(2)

https://blog.csdn.net/m0_37950361/article/details/82153147(核心代码,完整代码)

https://blog.csdn.net/qq_40788630/article/details/79662812(队列相关知识点)

https://blog.csdn.net/lee371042/article/details/81135007(队列与优先队列【有序】的总结)

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

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

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

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

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

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

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

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

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

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

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

  6. 【Java】 剑指offer(59-1) 滑动窗口的最大值

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...

  7. 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列

    剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...

  8. 【剑指offer】59 - I. 滑动窗口的最大值

    剑指 Offer 59 - I. 滑动窗口的最大值 知识点:队列:滑动窗口:单调 题目描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例 输入: nums = [ ...

  9. 滑动窗口的最大值 牛客网 剑指Offer

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

随机推荐

  1. GO语言html模板

    模板 一个模板是一个字符串或一个文件,里面包含了一个或多个由双花括号包含的{{action}}对象.大部分的字符串只是按面值打印,但是对于actions部分将触发其它的行为.每个actions都包含了 ...

  2. Python安装第三方库常用方法

    在学习Python过程中,经常要用到很多第三方库,面对各种不同情况,Python为我们提供了多种安装方法: 一.pip安装: pip安装相信大家都不陌生了,在安装第三方库中,pip是最常使用的一种方法 ...

  3. chrome离线安装包下载

    Google Chrome 已经是许多人的默认浏览器,但由于“你懂的”原因,在线安装基本没有成功过,他自己的自动更新也多数一直在加载中,所以我们会到一些下载站下载安装包,但我的多次经历告诉我,下载回来 ...

  4. LSTM和双向LSTM讲解及实践

    LSTM和双向LSTM讲解及实践 目录 RNN的长期依赖问题LSTM原理讲解双向LSTM原理讲解Keras实现LSTM和双向LSTM 一.RNN的长期依赖问题 在上篇文章中介绍的循环神经网络RNN在训 ...

  5. Flutter -------- Http库实现网络请求

    第三方库 http实现网络请求,包含get,post http库文档:https://pub.dev/packages/http 1.添加依赖 dependencies: http: ^0.12.0 ...

  6. Alternatives to Activiti for all platforms with any license

    Activiti Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted ...

  7. netty5服务端检测心跳超时断连

    客户端每5秒发送一次心跳给服务端,服务端记录最后一次心跳时间,通过定时任务每10秒检测一下,如果当前时间与最后一次收到的心跳时间之差超过某个阈值,断开与客户端的连接.基于之前的例子(netty5心跳与 ...

  8. Qt编写气体安全管理系统6-地图监控

    一.前言 地图监控主要是提供一个地图(可以是平面的也可以是立体彩色的,一般建议鸟瞰图,有3D感),然后设备在对应的地图上,可以切换地图来查看对应区域的设备,一般来说一个区域会有一个地图文件,设备在地图 ...

  9. PAT 甲级 1072 Gas Station (30 分)(dijstra)

    1072 Gas Station (30 分)   A gas station has to be built at such a location that the minimum distance ...

  10. easymock的用法

    常用场景 几个值随机取1个 "f08|1": ["有", "没有", "不知道"], 轮训抽一个 "f08|+ ...