数据结构入门-单调队列

news2024/11/26 10:42:48

数据结构入门-单调队列

原理介绍

双向队列

双向队列值示意图

思考一下:对于数组nums,我们想知道max(nums[i-k],...,nums[i])如何高效处理?

双向队列值示意图

单调队列

单调队列,即从队首到队尾单调的队列。

单调性
单调递增
单调递减
单调不增
单调不减
单调队列流程图

假设nums = [10,8,6,4,5,12],k=2,单调队列滑动窗口入队出队过程:

需要注意的是在滑动窗口时,我们需要知道原数据节点的下标,所以需要以二元组绑定索引值的形式处理。这种情况下,队首始终是最大值,并满足从队首到队尾单调递减。

请添加图片描述


例题练习

力扣 239. 滑动窗口最大值

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
		int[] ans = new int[n-k+1];
		Deque<Integer[]> ql = new ArrayDeque<Integer[]>();
		for (int i = 0; i < n; i++) {
			while (!ql.isEmpty() && i-ql.peekFirst()[0] >= k) ql.pollFirst();
			Integer[] t = {i, nums[i]};
			while (!ql.isEmpty() && ql.peekLast()[1] < nums[i]) ql.pollLast();
            ql.offerLast(t);
			if (i-k+1 >= 0) ans[i-k+1] = ql.peekFirst()[1];
		}
		return ans;
    }
}

P1886 滑动窗口 /【模板】单调队列

70分~,这道题还是建议使用C++,否则很容易内存超出(MLE)或者时间超出(TLE)。

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Main {
	static int[] minSlidingWindow(int[] nums, int k) {
		int n = nums.length;
		int[] ans = new int[n-k+1];
		Deque<Integer[]> ql = new ArrayDeque<Integer[]>();
		for (int i = 0; i < n; i++) {
			while (!ql.isEmpty() && i-ql.peekFirst()[0] >= k) ql.pollFirst();
			Integer[] t = {i, nums[i]};
			while (!ql.isEmpty() && ql.peekLast()[1] > nums[i]) ql.pollLast();
			ql.offerLast(t);
			if (i-k+1 >= 0) ans[i-k+1] = ql.peekFirst()[1];
		}
		return ans;
	}
	static int[] maxSlidingWindow(int[] nums, int k) {
		int n = nums.length;
		int[] ans = new int[n-k+1];
		Deque<Integer[]> ql = new ArrayDeque<Integer[]>();
		for (int i = 0; i < n; i++) {
			while (!ql.isEmpty() && i-ql.peekFirst()[0] >= k) ql.pollFirst();
			Integer[] t = {i, nums[i]};
			while (!ql.isEmpty() && ql.peekLast()[1] < nums[i]) ql.pollLast();
			ql.offerLast(t);
			if (i-k+1 >= 0) ans[i-k+1] = ql.peekFirst()[1];
		}
		return ans;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
		int n = sc.nextInt();
		int k = sc.nextInt();
		int[] nums = new int[n];
		for (int i = 0; i < n; i++) {
			nums[i] = sc.nextInt();
		}
		int[] ans1 = minSlidingWindow(nums, k);
		int[] ans2 = maxSlidingWindow(nums, k);
		for (int i = 0; i < n-k+1; i++) {
			out.print(ans1[i]);
			if (i != n-k) out.print(" ");
		}
		out.println();
		out.flush();
		for (int i = 0; i < n-k+1; i++) {
			out.print(ans2[i]);
			if (i != n-k) out.print(" ");
		}
		out.flush();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从mask rcnn到mask scoring rcnn

mrcnn (mask rcnn) 不足:框架没有解决实例分割评分 对mask head输出的K(类别)个mask,选择哪个mask作为最终的输出,取决于分类支路置信度最高的类别。也就是用分类置信度来衡量mask质量,这会导致下图的现象: 左侧四幅图像显示出良好的检测结果,具有高分类分数但掩模质…

【spring系列】SPI详解

1.什么是SPI SPI全称Service Provider Interface&#xff0c;是Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。2.SPI和API的使用场景 API &#xff08;Application Programming …

大数据Kudu(七):Kudu分区策略

文章目录 Kudu分区策略 一、​​​​​​​Partition By Range - 范围分区

最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例

最近在工作中&#xff0c;发现接触到的很多小伙伴分不清楚logback slf4j 以及log4j 的关系&#xff0c;有的人认为是一个东西&#xff0c;有的人认为是完全没关系&#xff0c;或者说有关系但是不清楚具体是什么区别和联系&#xff0c;今天咱们就简单梳理下他们之间的联系和区别…

项目式学习法(PBL)如何让你快速成为行业专家【一杯咖啡谈项目】

项目人人都是主角&#xff0c;没有旁观者。我们每个人也应当好PM&#xff0c;这就离不开学习提升自己&#xff0c;&#xff0c;如此&#xff0c;方能更好推动经济社会高质量发展。 1、项目式学习是什么&#xff1f; 关于项目式学习&#xff0c;目前国内外还没有个统一的定义&…

【python】 json字符串转对象

目录 一&#xff1a;json对象转换为json字符串 二&#xff1a;json字符串转换为json对象 三&#xff1a;json字符串{"name":"lily","sno":1001} 四&#xff1a;python面向对象程序设计 一&#xff1a;json对象转换为json字符串 import json…

Elasticsearch 安装及启动【Linux】

一、下载安装包 1.下载 Elasticsearch 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 2.下载 Kibana Kibana 数据可视化平台可以选择性安装 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#kiban…

连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册

什么是Java虚拟机&#xff1f; 虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息…

怎么防止同事用Evil.js的代码投毒

最近Evil.js被讨论的很多&#xff0c;项目介绍如下 项目被发布到npm上后&#xff0c;引起了激烈的讨论&#xff0c;最终因为安全问题被npm官方移除&#xff0c;代码也闭源了 作为一个前端老司机&#xff0c;我肯定是反对这种行为&#xff0c;泄私愤有很多种方式&#xff0c;代…

深度学习——多GPU训练代码实现

1.数据并行性。 一台机器有K个GPU&#xff0c;给定训练模型&#xff0c;每个GPU参数值是相同且同步&#xff0c;每个GPU独立地维护一组完整地模型参数。k2时数据并行地训练模型&#xff0c;利用两个GPU上的数据&#xff0c;并行计算小批量随机梯度下降。 K个GPU并行训练过程&a…

【Spring Cloud】Eureka注册中心从原理到实战图文详细教程

本期目录1. Eureka介绍1.1 Eureka能解决的问题2. Eureka原理3. 搭建Eureka Server3.1 引入依赖3.2 编写启动类3.3 修改配置文件3.4 启动Eureka微服务4. 服务注册4.1 导入依赖4.2 修改配置文件4.3 重启微服务4.4 启动多个微服务实例5. 服务发现5.1 修改业务层代码5.2 在RestTemp…

A_A05_002 sscom33串口调试助手使用

目录 一、软件获取 二、软件基本功能介绍 1、接收区 2、串口通信参数配置区 3、串口打开关闭与其他设置区域 4、手动发送区域 5、多文本发送区 6、辅助区域 三、注意事项 一、软件获取 网盘链接 直戳跳转 二、软件基本功能介绍 1、接收区 接收区就是接收外部设备给串口…

【2022年终总结】总结自己的2022,展望2023

目录一、工作杭州【述职-涨薪】【项目】从0到1&#xff0c;从1到多&#xff0c;在工作中寻找方法&#xff0c;承担更多的责任【技能】丰富了技术广度武汉1. 【项目】一个人就是一个团队二、成为博客新秀&前端领域优质创作者三、生活旅行猫猫情感2023年的flag学习&#xff1…

FFmpeg- 常用的滤镜命令

下面来熟悉一下常用的对视频操作的几个命令。这次需要完成的命令也包括在其中。 视频的画面大小的剪切(crop filter) 将输入的视频的帧&#xff0c;以左上角为坐标的原点&#xff0c;剪切成x,y坐标开始的指定大小。 语法&#xff1a; # []包裹的选项是可选的 crop ow[:oh[:x[:…

3D三维地图APP

3D三维地图APP 发布时间&#xff1a;2018-07-19 版权&#xff1a; 3D地图依据高程数据等对地表进行渲染&#xff0c;实现地表的起伏&#xff0c;模拟出真实的三维场景&#xff0c;让你有如身临其境般的感觉。 &#xff08;注&#xff1a;Bigemap 3D地图是一个三维地图浏览功能…

RNA-seq 详细教程:Wald test(10)

学习目标 了解生成比较结果所需的步骤&#xff08;Wald 检验&#xff09;总结不同层次的基因过滤了解对数倍变化收缩结果探索 默认情况下&#xff0c;DESeq2 使用 Wald 检验来识别在两个样本之间差异表达的基因。给定设计公式中使用的因素&#xff0c;以及存在多少个因素水平&a…

大学生影视主题网页制作 腾龙电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

基于WIFI无线组网的水雨情远程监测预警系统

水雨情是重要的水文资料&#xff0c;在水资源配置和管理中有重要的参考价值&#xff0c;具体是指水位、流速、流量、降雨量、降雨强度等参数。随着物联网、雷达遥测、无线通信技术的发展&#xff0c;这些数据都能实现自动感知和远程监测&#xff0c;对于防汛抗洪和日常巡检有重…

MySql explain

执行计划是SQL语句经过查询分析器后得到的 抽象语法树 和 相关表的统计信息 作出的一个查询方案&#xff0c;这个方案是由查询优化器自动分析产生的。由于是动态数据采样统计分析出来的结果&#xff0c;所以可能会存在分析错误的情况&#xff0c;也就是存在执行计划并不是最优的…

经CSDN副总裁点拨,我发现了世界杯球队与优秀开发团队的共通点

☆ 世界杯已经快要接近尾声了&#xff0c;而无论法国还是阿根廷谁能走到最后&#xff0c;无疑他们都是非常优秀的世界杯球队&#xff0c;甚至可以说&#xff0c;能进入世界杯的球队&#xff0c;都是举世瞩目的国家队阵容。 ☆ 而我最近也一直在思考&#xff0c;那么我们的开发团…