剑指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 ...
随机推荐
- 力扣585(MySQL)-2016年的投资(中等)
题目: 写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数. 对于一个投保人,他在 2016 年成功投资的条件是: 他在 2015 年的投保额 (TIV ...
- 零信任策略下K8s安全监控最佳实践(K+)
简介: 本文重点将围绕监控防护展开,逐层递进地介绍如何在复杂的分布式容器化环境中借助可观测性平台,持续监控K8s集群,及时发现异常的 API 访问事件.异常流量.异常配置.异常日志等行为,并且结合合理 ...
- 阿里云 ACK One 多集群管理全面升级:多集群服务、多集群监控、两地三中心应用容灾
简介: 本文介绍了 ACK One 近期发布的 3 个主要特性,覆盖了多集群管理的 3 个主要场景,跨集群服务发现与访问.多集群全局监控.应用容灾.除多集群管理外,ACK One 更是支持连接并管理任 ...
- 客户端单元测试实践——C++篇
简介: 我们团队在手淘中主要负责BehaviX模块,代码主要是一些逻辑功能,很少涉及到UI,为了减少双端不一致问题.提高性能,我们采用了将核心代码C++化的策略.由于团队项目偏底层,测试同学难以完全覆 ...
- 盒马新零售基于DataWorks搭建数据中台的实践
大家好,我叫许日花名欢伯,在2016年盒马早期的时候,我就转到了盒马的事业部作为在线数据平台的研发负责人,现在阿里云的计算平台负责DataWorks的建模引擎团队.今天的分享内容也来源于另一位嘉宾李启 ...
- 浅谈RSocket与响应式编程
简介: RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用.另外,RSocket也是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成.本文我们将和大家分享RSocket与响 ...
- 最佳实践丨云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航
简介: 企业业务上云后,还面临特定可用区购买云上特定计算产品实例失败的困境?云上私有池pick一下 Why 云上业务为什么需要资源确定性.服务连续性 云计算正朝着像水电煤一样的基础设施演进,支持用户 ...
- [Docker] 镜像源配置 for Linux
$ vi /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.mirrors.ustc.edu ...
- [Gin] 支持 FORM 和 JSON 参数的绑定与验证
Gin 支持对不同传参方式的参数进行统一绑定并验证,比如如下两种格式: Content-Type: application/x-www-form-urlencoded with a=XX&b= ...
- dotnet 6 在 System.Text.Json 使用 source generation 源代码生成提升 JSON 序列化性能
这是一个在 dotnet 6 早就引入的功能,此功能的使用方法能简单,提升的效果也很棒.使用的时候需要将 Json 序列化工具类换成 dotnet 运行时自带的 System.Text.Json 进行 ...