剑指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 ...
随机推荐
- linux设置定时任务的方法步骤
一,首先登录 二,找到文件夹 三,查看定时任务 crontab -l 四,vi root 编辑定时任务 编辑完成后,点ESC,然后:wq 时间格式 分钟 小时 日期 月份 周 命令 数字范围 0-59 ...
- ubuntu之路——day10.1 ML的整体策略——正交化
orthogonalization 正交化的概念就是指,将你可以调整的参数设置在不同的正交的维度上,调整其中一个参数,不会或几乎不会影响其他维度上的参数变化,这样在机器学习项目中,可以让你更容易更快速 ...
- 如何使用eclipse创建简单的servlet
Servlet是一种基于java开发的服务器程序,可以对外公布服务,如果是浏览器应用,可以通过浏览器打开网址的方式查看服务.创建servlet要继承httpservlet,并且在web.xml中配置拦 ...
- excel : 如何快速跳到某一行
在表格的上方,公式栏的左侧,即“名称框”输入单元格行列符号,如A1,B2,等 回车即可
- DevOps Scrum Agile Tech Debt
从实践中长出的 DevOps 大树 - 服务管理 - CIO时代—新技术.新商业.新管理http://www.hunnatv.com/glfw/145411.html Nexus规模化Scrum框架h ...
- [转]Android四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
原文地址:http://c.biancheng.net/view/2918.html Android 作为一个移动设备的开发平台,其软件层次结构包含操作系统 (OS).中间件 (MiddleWare) ...
- flutter drawer 自定义图标 icon 手动打开drawer
方法1:GlobalKey import "package:flutter/material.dart"; class Test extends StatefulWidget { ...
- Python判断是否是闰年
year = 2012 if year % 100 != 0 and year % 4 == 0: print('闰年') elif year % 100 == 0 and year % 400 == ...
- 异常检测-基于孤立森林算法Isolation-based Anomaly Detection-2-实现
参考https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html#sklearn.en ...
- SeetaFace2 cmake VS2015编译编译
cmake Selecting Windows SDK version 10.0.17134.0 to target Windows 10.0.18362. == BUILD_VERSION: v2. ...