剑指offer64:滑动窗口的最大值
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:滑动窗口的最大值的更多相关文章
- 剑指offer64:滑动窗口的最大值
题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4, ...
- 剑指0ffer59.滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...
- 剑指offer——滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6, ...
- 剑指offer--50.滑动窗口的最大值
时间限制:1秒 空间限制:32768K 热度指数:157641 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的 ...
- 剑指Offer-滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- 【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...
- 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列
剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...
- 【剑指offer】59 - I. 滑动窗口的最大值
剑指 Offer 59 - I. 滑动窗口的最大值 知识点:队列:滑动窗口:单调 题目描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例 输入: nums = [ ...
- 滑动窗口的最大值 牛客网 剑指Offer
滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...
随机推荐
- 解决tecplot中壁面速度不为0的问题
当直接将fluent的.cas文件和.dat文件导入tecplot中进行后处理的时候,我们会发现,壁面速度不为0的情况(见上图). 出现这样问题的原因为:fluent的计算数据是存储在每个单元的中心位 ...
- Echarts:实现拖拽效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- 搭建Nuxt项目(搭配Element UI、axios)
使用Nuxt Nuxt.js文档:https://zh.nuxtjs.org/guide/ 开始 初始化Nuxt项目 npx create-nuxt-app <项目名> // or yar ...
- PHP使用MongoDB类操作MongoDB数据库总结
参考:https://www.php.net/manual/zh/class.mongodb-driver-manager.php 参考:https://www.zhaokeli.com/articl ...
- pythonUDP发送结构体,对齐到C++结构体
给出程序先: import random import socket import struct import threading import pickle import json from str ...
- [转][linux][centos]嵌入式 Linux下编译并使用curl静态库
#x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...
- [原][landcover]全球地表植被样例图片
图由南水之源提供,感谢 流socket 制作总结 原截图如下:按字母顺序排序 asphalt asphalt_bright asphalt_white brightRockOnly broad ...
- mysql 安装参考
https://blog.csdn.net/qq_38756992/article/details/84929787 https://www.cnblogs.com/joyny/p/10991194. ...
- Python3基础 二、八、十、十六进制转换
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- MFC加载osg模型
创建MFC单文档项目, OSGObject.h #pragma once #include <osgViewer\Viewer> #include <osgDB\ReadFile&g ...