剑指Offer-64.滑动窗口的最大值(C++/Java)
题目:
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,3,4,2,6,2,5,1}为例。
num | deque | result |
2 | [0]->{2} | |
3 | [1]->{3} | |
4 | [2]->{4} | 4 |
2 | [2, 3]->{4,2} | 4 |
6 | [4]->{6} | 6 |
2 | [4, 5]->{6,2} | 6 |
5 | [4, 6]->{6,5} | 6 |
1 | [6, 7]->{5,1} | 5 |
遍历到新的元素时,队首元素就是当前滑动窗口元素的最大值,只不过需要当索引大于等于size-1时才向结果集中添加元素。
程序:
C++
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> res;
deque<int> deq;
for(int i = 0; i < num.size(); ++i){
while(!deq.empty() && num[deq.back()] < num[i])
deq.pop_back();
deq.push_back(i);
if(deq.front() == i-size)
deq.pop_front();
if(i >= size-1)
res.push_back(num[deq.front()]);
}
return res;
}
};
Java
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
if(num == null || size < 1)
return res;
for(int i = 0; i < num.length; ++i) {
while(!deque.isEmpty() && num[deque.getLast()] < num[i])
deque.removeLast();
deque.add(i);
if(deque.getFirst() == i - size)
deque.removeFirst();
if(i >= size - 1)
res.add(num[deque.getFirst()]);
}
return res;
}
private ArrayList<Integer> res = new ArrayList<>();
private Deque<Integer> deque = new LinkedList<>();
}
剑指Offer-64.滑动窗口的最大值(C++/Java)的更多相关文章
- 剑指Offer 64. 滑动窗口的最大值 (其他)
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- [剑指Offer] 64.滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- 【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...
- Go语言实现:【剑指offer】滑动窗口的最大值
该题目来源于牛客网<剑指offer>专题. 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存 ...
- 【剑指Offer】滑动窗口的最大值 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 暴力求解 单调递减队列 日期 题目地址:https://www ...
- 剑指offer:滑动窗口的最大值
滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值 ...
- 【剑指offer】滑动窗口的最大值,C++实现
原创博文,转载请注明出处! # 题目 # 思路 利用C++中的双端队列保存有可能是滑动窗口最大值的下标,其中队首元素保存当前窗口最大值的下标.当滑动窗口改变时,更新队列.队列更新的规则:(1)新元素依 ...
- 剑指offer:滑动窗口的最大值(栈和队列)
1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别 ...
- 剑指offer64:滑动窗口的最大值
1 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4 ...
- 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...
随机推荐
- 转载 | 基于函数计算自定义运行时快速部署一个 springboot 项目
简介: 本文转自函数计算征集令优秀征文,活动火热进行中,欢迎大家报名参加! 什么是函数计算? 函数计算是事件驱动的全托管计算服务.使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码.函 ...
- 摆脱 AI 生产“小作坊”:如何基于 Kubernetes 构建云原生 AI 平台
简介:本文将介绍和梳理我们对云原生 AI 这个新领域的思考和定位,介绍云原生 AI 套件产品的核心场景.架构和主要能力. 作者:张凯 前言 云原生(Cloud Native)[1]是云计算领域过 ...
- DataX在数据迁移中的应用
简介: DataX在数据迁移中的应用 1. DataX定义 首先简单介绍下datax是什么.DataX是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlSe ...
- 重磅官宣:Nacos2.0 发布,性能提升 10 倍
简介: 继 Nacos 1.0 发布以来,Nacos 迅速被成千上万家企业采用,并构建起强大的生态.但是随着用户深入使用,逐渐暴露一些性能问题,因此我们启动了 Nacos 2.0 的隔代产品设计,时隔 ...
- 解密万亿参数M6模型预训练背后的分布式框架Whale
简介: 最近,阿里云PAI团队和达摩院智能计算实验室一起发布"低碳版"巨模型M6,大幅降低万亿参数超大模型训练能耗.借助我们自研的Whale框架仅使用480卡GPU,即训练出了规 ...
- [FAQ] Vue 如何控制标签元素的某个属性的显示 ?
这需要借助 v-model 的用法,动态决定元素的展示. <q-btn :disable="2 > 1">按钮</q-btn> 展示结果是:<q ...
- 关于Git和Svn的区别
关于Git 和 Svn 的选用,详细列出区别 Git 是分布式的,而 Svn 不是分布的; Git 把内容按元数据方式存储,而 SVN 是按文件; Git 没有一个全局版本号,而 SVN 有:目前为止 ...
- Blazor/Hybird 触屏下单程序调优笔记
环境 Blazor Net8.0 + FreeSql + Bootstrap Blazor 组件 以下都是自己瞎琢磨的和官网资料搬运,肯定有不少错漏和不合理的地方,非常希望各位大佬评论区给我建议和意见 ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-43-分页测试
1.简介 分页测试,这种一般都是公共的方法系统中都写好了,这种一般出现是数据展示比较多的时候,会采取分页的方法,而且比较固定,一般是没有问题的,因此它非常适合自动化测试,但是如何使用playwrigh ...
- Linux curl命令使用代理、以及代理种类介绍
Linux curl命令使用代理.以及代理种类介绍 https://www.cnblogs.com/panxuejun/p/10574038.html 测试代理的方法: curl -x ip:port ...