Java 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
集合 关系 介绍
Deque 是一个接口
LinkedList 是这个接口的实现类

题目

输入输出


滑动窗口
基于双端队列实现
Deque<Integer> deque = new LinkedList<>();
滑动窗口代码 洛谷
public static List<Integer> maxSlidingWindow(int[] nums, int k) {List<Integer> result = new ArrayList<>();Deque<Integer> deque = new LinkedList<>();for (int i = 0; i < nums.length; i++) {// 移除不在当前窗口的元素if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {deque.pollFirst();}// 移除队列中比当前元素小的元素,因为它们不可能成为最大值while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) {deque.pollLast();}// 将当前元素的索引加入队列deque.offerLast(i);// 窗口已满,记录当前窗口的最大值if (i >= k - 1) {result.add(nums[deque.peekFirst()]);}}return result;}// 求每个窗口的最小值public static List<Integer> minSlidingWindow(int[] nums, int k) {List<Integer> result = new ArrayList<>();Deque<Integer> deque = new LinkedList<>();for (int i = 0; i < nums.length; i++) {// 移除不在当前窗口的元素if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {deque.pollFirst();}// 移除队列中比当前元素大的元素,因为它们不可能成为最小值while (!deque.isEmpty() && nums[deque.peekLast()] >= nums[i]) {deque.pollLast();}// 将当前元素的索引加入队列deque.offerLast(i);// 窗口已满,记录当前窗口的最小值if (i >= k - 1) {result.add(nums[deque.peekFirst()]);}}return result;}
API
在 Java 中,Deque 是一个双端队列接口,它继承自 Queue 接口,支持在队列的两端进行元素的插入、删除和访问操作。LinkedList 是 Deque 接口的一个实现类,下面介绍 Deque<Integer> deque = new LinkedList<>(); 常见的操作。
1. 插入元素
- 在队列头部插入元素
-
addFirst(E e):将指定元素插入此双端队列的开头。如果插入失败(例如队列已满,但LinkedList一般不会出现这种情况),会抛出异常。offerFirst(E e):将指定元素插入此双端队列的开头。如果插入成功返回true,否则返回false。
- 在队列尾部插入元素
-
addLast(E e):将指定元素插入此双端队列的末尾。如果插入失败,会抛出异常。offerLast(E e):将指定元素插入此双端队列的末尾。如果插入成功返回true,否则返回false。
示例代码:
import java.util.Deque;
import java.util.LinkedList; public class DequeInsertionExample { public static void main(String[] args) { Deque<Integer> deque = new LinkedList<>(); // 在头部插入元素 deque.addFirst(1); deque.offerFirst(2); // 在尾部插入元素 deque.addLast(3); deque.offerLast(4); System.out.println(deque); // 输出: [2, 1, 3, 4] }
}
2. 删除元素
- 删除队列头部元素
-
removeFirst():移除并返回此双端队列的第一个元素。如果队列为空,会抛出异常。pollFirst():移除并返回此双端队列的第一个元素。如果队列为空,返回null。
- 删除队列尾部元素
-
removeLast():移除并返回此双端队列的最后一个元素。如果队列为空,会抛出异常。pollLast():移除并返回此双端队列的最后一个元素。如果队列为空,返回null。
示例代码:
import java.util.Deque;
import java.util.LinkedList; public class DequeRemovalExample { public static void main(String[] args) { Deque<Integer> deque = new LinkedList<>(); deque.add(1); deque.add(2); deque.add(3); // 删除头部元素 Integer firstRemoved = deque.removeFirst(); System.out.println("Removed first: " + firstRemoved); // 输出: Removed first: 1 // 删除尾部元素 Integer lastRemoved = deque.pollLast(); System.out.println("Removed last: " + lastRemoved); // 输出: Removed last: 3 System.out.println(deque); // 输出: [2] }
}
3. 访问元素
- 访问队列头部元素
-
getFirst():返回此双端队列的第一个元素。如果队列为空,会抛出异常。peekFirst():返回此双端队列的第一个元素。如果队列为空,返回null。
- 访问队列尾部元素
-
getLast():返回此双端队列的最后一个元素。如果队列为空,会抛出异常。peekLast():返回此双端队列的最后一个元素。如果队列为空,返回null。
示例代码:
import java.util.Deque;
import java.util.LinkedList; public class DequeAccessExample { public static void main(String[] args) { Deque<Integer> deque = new LinkedList<>(); deque.add(1); deque.add(2); deque.add(3); // 访问头部元素 Integer firstElement = deque.getFirst(); System.out.println("First element: " + firstElement); // 输出: First element: 1 // 访问尾部元素 Integer lastElement = deque.peekLast(); System.out.println("Last element: " + lastElement); // 输出: Last element: 3 }
}
4. 其他操作
isEmpty():判断双端队列是否为空。size():返回双端队列中的元素个数。
示例代码:
import java.util.Deque;
import java.util.LinkedList; public class DequeOtherOperationsExample { public static void main(String[] args) { Deque<Integer> deque = new LinkedList<>(); System.out.println("Is deque empty? " + deque.isEmpty()); // 输出: Is deque empty? true deque.add(1); deque.add(2); System.out.println("Size of deque: " + deque.size()); // 输出: Size of deque: 2 }
}
例题
https://codeforces.com/problemset/problem/977/D


// @github https://github.com/Dddddduo
// @github https://github.com/Dddddduo/acm-java-algorithm
// @github https://github.com/Dddddduo/Dduo-mini-data_structure
import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;/*** 题目地址**/// xixi♡西
public class Main {static IoScanner sc = new IoScanner();static final int mod = (int) (1e9 + 7);
// static final int mod = (int) (1e9 + 7);static int n;static long arr[];static boolean visited[];static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();/*** @throws IOException*/private static void solve() throws IOException {// todon=sc.nextInt();arr=new long[n];long max=0;ArrayList<Long>list=new ArrayList<>();for(int i=0;i<n;i++){arr[i]=sc.nextLong();list.add(arr[i]);max=Math.max(max,arr[i]);}Deque<Long> deque = new LinkedList<>();deque.add(max);long ans1=max;while(true){if(ans1%3==0){if(list.contains(ans1/3)){deque.addLast(ans1/3);list.remove(ans1/3);ans1/=3;continue;}}if(list.contains(ans1*2)){deque.addLast(ans1*2);list.remove(ans1*2);ans1*=2;continue;}break;}ans1=max;while(true){if(ans1%2==0){if(list.contains(ans1/2)){deque.addFirst(ans1/2);list.remove(ans1/2);ans1/=2;continue;}}if(list.contains(ans1*3)){deque.addFirst(ans1*3);list.remove(ans1*3);ans1*=3;continue;}break;}for (Long l : deque) {dduo(l+" ");}}public static void main(String[] args) throws Exception {int t = 1;
// t = sc.nextInt();while (t-- > 0) {solve();}}static <T> void dduo(T t) {System.out.print(t);}static <T> void dduoln() {System.out.println("");}static <T> void dduoln(T t) {System.out.println(t);}
}/*** IoScanner类** @author Dduo* @version 1.0* @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。*/
class IoScanner {BufferedReader bf;StringTokenizer st;BufferedWriter bw;public IoScanner() {bf = new BufferedReader(new InputStreamReader(System.in));st = new StringTokenizer("");bw = new BufferedWriter(new OutputStreamWriter(System.out));}public String nextLine() throws IOException {return bf.readLine();}public String next() throws IOException {while (!st.hasMoreTokens()) {st = new StringTokenizer(bf.readLine());}return st.nextToken();}public char nextChar() throws IOException {return next().charAt(0);}public int nextInt() throws IOException {return Integer.parseInt(next());}public long nextLong() throws IOException {return Long.parseLong(next());}public double nextDouble() throws IOException {return Double.parseDouble(next());}public float nextFloat() throws IOException {return Float.parseFloat(next());}public BigInteger nextBigInteger() throws IOException {return new BigInteger(next());}public BigDecimal nextDecimal() throws IOException {return new BigDecimal(next());}
}相关文章:
Java 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
集合 关系 介绍 Deque 是一个接口 LinkedList 是这个接口的实现类 题目 输入输出 滑动窗口 基于双端队列实现 Deque<Integer> deque new LinkedList<>(); 滑动窗口代码 洛谷 public static List<Integer> maxSlidingWindow(int[] nums, int k) {List&l…...
【商城实战(54)】解锁商城国际化密码:内容管理全攻略
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
AI代码编辑器:Cursor和Trae
Cursor 定义:Cursor 是一款基于AI的代码编辑器,它继承了VS Code的核心功能,并在此基础上增加了深度AI支持。它支持代码生成、优化、重构以及调试等功能,提供直观的Diff视图和自动补全功能,是一款功能强大的编程工具。…...
[学习笔记] VM虚拟机安装Ubuntu系统
前言 我现在装的Ubuntu总是死机,经常黑屏,所以我决定换个版本,顺便写一下笔记,给大家分享如何安装虚拟机 下载 这里我选择的是Ubuntu 22.04.5 LTS,下载链接:Ubuntu 22.04.5 LTS 如果访问不了网站的话&…...
统计学重要概念:自由度
在统计学中,自由度(degrees of freedom,简称df)是一个重要的概念,它表示在计算某个统计量时可以自由变化的值的数量。对于一个样本量为n的样本,自由度通常为n-1,这是因为我们需要用样本数据来估…...
3.22模拟面试
前端模拟面试(1 年经验) 面试时长:40-60 分钟 面试难度:初中级 技术栈:Vue 3、TypeScript、微前端(qiankun)、Webpack/Rspack、Ant Design、组件库迁移 一、基础知识 HTML & CSS 介绍一下…...
汇编语言习题笔记——第1章 汇编语言基础
第1章 汇编语言基础 1. IA-32处理器有哪三类基本段,各是什么用途? 段类型寄存器主要用途特点代码段 (CS)CS存储可执行指令执行权限,通常只读,与 IP/EIP/RIP 配合,确定指令地址数据段 (DS, ES, FS, GS)DS, ES, FS, GS存储程序数据 (变量, 数据结构等)读写权限,多个寄存器…...
为扣子智能体接入 DeepSeek
扣子现已推出满血版 DeepSeek 全家桶,支持免费体验 R1、V3 模型。除此之外,扣子支持 DeepSeek 思维链(Chain-of-Thought,CoT)和 Function Calling 能力,为你的智能体添加私有知识和多种技能,拓展…...
3.22日西南竞篮,NBA勇士VS老鹰,赛前数据前瞻
3.22日NBA勇士VS老鹰赛前数据前瞻 关键要点 明天(3月22日)的NBA比赛是金州勇士对阵亚特兰大老鹰,盘口为勇士让2.5分,大小分预设为230.5。 勇士目前战绩41胜29负,西部第六;老鹰战绩33胜36负,东部…...
C语言:循环控制结构习题
1水仙花数是指各个位数的立方和等于本身的三位数。例如:153是水仙花数,因为1531的立方5的立方3的立方。 编程计算并输出所有的水仙花数。 第一种做法 思路: 1三位数:百位,十位和个位,除了百位是1-9&#…...
Dear ImGui for Unity 常见问题解决方案
Dear ImGui for Unity 常见问题解决方案 dear-imgui-unity Unity package for Dear ImGui 项目地址: https://gitcode.com/gh_mirrors/de/dear-imgui-unity 1. 项目基础介绍 Dear ImGui for Unity 是一个开源项目,旨在将Dear ImGui库整合到Unity游戏引擎中。…...
【Unity3D】摄像机适配场景以及Canvas适配
目录 宽度不变策略 高度不变策略 宽度不变策略 开发分辨率 750*1334 (宽高比:0.56) 真机分辨率 1170*2532 (宽高比:0.46) 真机宽高比<开发宽高比,采用宽度不变策略 理由:小于代表真机高度比开发高度更大,因此不需要担心高度上…...
盛铂科技国产SLMF315超低相位噪声频率综合器介绍
SLMF315频率综合器简介: 盛铂科技SLMF315超低相位噪声频率综合器的频率范围覆盖200MHz至15GHz。频率的最小步进仅为0.1Hz,在不考虑频率精度的情况下频率步进可达0.04Hz。SLMF315内部采用多环路设计从而获得极优秀的相位噪声特性,频率输出为1…...
一个简单的人脸识别demo
使用face_recognition和OpenCV库完成人脸检测和识别任务: # 导入必要的库 import cv2 # OpenCV库,用于图像处理 import face_recognition # 人脸识别库 import numpy as np # 数值计算库# 步骤1:加载已知人脸的图片并编码 # 加载乔布斯的…...
SpringDoc和Swagger使用
目录 一、SpringDoc 1.添加依赖 2.配置代码 配置解释 (1)springdoc.api-docs.path (2)springdoc.swagger-ui.path (3)springdoc.swagger-ui.operationsSorter (4)springdoc.…...
RestTemplate和RPC区别
RestTemplate是Spring框架中用于进行RESTful风格的HTTP请求的模板类,通常用于与外部服务进行通信。它基于HTTP协议,使用GET、POST、PUT、DELETE等HTTP方法来进行通信,传输的数据通常使用JSON或XML格式。它是一种基于资源的通信方式࿰…...
asp.net core mvc模块化开发
razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…...
第2.2节 Android Jacoco插件覆盖率采集
JaCoCo(Java Code Coverage)是一款开源的代码覆盖率分析工具,适用于Java和Android项目。它通过插桩技术统计测试过程中代码的执行情况,生成可视化报告,帮助开发者评估测试用例的有效性。在github上开源的项目ÿ…...
Vue3中router最佳封装落地
文章目录 前言一、拆分路由文件夹?二、main.ts中注册路由总结 前言 router在使用过程中如果我们直接在一个文件的一个数组中配置,最后路由越来越多会导致不易管理,我们可以将一个页面的路由配置在一个数组中最后统一导入,这样就会…...
MySQL Router被HTTP流量击穿
## MySQL Router被HTTP流量击穿 #莫名奇妙的问题,谁让客户把Router放公网呢?除了被挖矿,还能被HTTP流量攻击。 1、日志信息 rootubuntu:/mysql# terminate called after throwing an instance of ‘mysqlrouter: :URIErrorwhat(): inval…...
网络爬虫【爬虫库request】
我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上&…...
如何使用jenv工具管理多个JDK版本
一、jenv到底是干啥的? 简单来说,jenv就是专门用来管理多个Java版本的工具。不管是开发、测试,还是生产环境,只要你需要在同一台机器上用不同的Java版本,它都能帮上大忙。比如说,项目A要求JDK 8࿰…...
如何彻底解决Docker Desktop中Kubernetes无法启动问题
我们时常会遇到Kubernetes启动提示如下报错信息: {"message":"starting kubernetes: pulling images: pulling from host: pulling tag \"registry.k8s.io/etcd:3.5.16-0\": Error response from daemon: .Log in with your Docker ID or…...
aws(学习笔记第三十四课) dockerized-app with asg-alb
aws(学习笔记第三十四课) dockerized-app with asg-alb 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer 学习内容: 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer在AutoScalingGroup中使用efs以及R…...
嵌入式c学习七
c语言指针:程序需要载入内存中运行,在32bit系统中内存地址的范围是:0x0000 0000-0xFFFF FFFF,内存大小为4GB,内存地址指的是内存单元的编号是固定的,本身就是一个整数,对于32bit系统,…...
Selenium Web UI自动化测试:从入门到实战
引言 在当今快速迭代的软件开发周期中,自动化测试已成为保障产品质量、提升测试效率的核心手段之一。而针对Web应用的UI自动化测试,Selenium作为最流行的开源工具之一,凭借其跨浏览器、多语言支持(Python、Java、C#等)…...
【实战指南】用MongoDB存储文档和图片等大文件(Java实现)
一、前言 在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文…...
Jetpack Compose 显示时间
Jetpack Compose 显示时间 介绍主体代码使用 介绍 在软件中实时显示时间 主体代码 import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStat…...
vue3中,通过获取路由上的token直接进入首页,跳过登录页面
1.需求 A系统想快速进入到B系统,但又不想输入账号密码,A系统的token与B系统共用token,因此在访问B系统就会在路径上携带token(https://magictool-box.com/login?token《token》),通过token直接进入B系统首…...
软考通关利器:中级软件设计师结构化开发核心考点
简介: 作为国家软考中级认证的核心科目,“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点,深度解析需求建模、结构化分析方法(SA/SD)、模块设计原则、数据流图(DFD&#…...
