力扣239. 滑动窗口最大值

embedded/2024/12/22 23:55:50/

Problem: 239. 滑动窗口最大值

文章目录

  • 题目描述
  • 思路
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述

思路

1.编写实现优先队列类:

1.1.实现push(int n):将元素n添加到队列尾,同时将n前面大于n的元素删除
1.2.实现int max():将队列头元素取出(由于实现了push所以此时队列头元素为当前队列中的最大值)
1.3.实现pop(int n):将队列头的元素n删除(代码实现中,需要先检查n是否还在当前对头。因为n有可能已经删除掉了)

2.题目代码逻辑实现:

2.1.生成窗口:将前k个元素添加到实现的优先队列中;
2.2.维护窗口:每次push一个新的元素到窗口,再取出当前窗口中的最大值添加到结果集合中,再删除之前的窗口左侧

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为数组nums的长度

空间复杂度:

O ( n ) O(n) O(n);

Code

/* Monotonic queue implementation */
class MonotonicQueue {LinkedList<Integer> maxq = new LinkedList<>();public void push(int n) {// Delete all elements smaller than nwhile (!maxq.isEmpty() && maxq.getLast() < n) {maxq.pollLast();}// Then add n to the tailmaxq.addLast(n);}public int max() {return maxq.getFirst();}public void pop(int n) {if (n == maxq.getFirst()) {maxq.pollFirst();}}
}class Solution {/**** Sliding Window Maximum** @param nums Given array* @param k Given number* @return int[]*/public int[] maxSlidingWindow(int[] nums, int k) {MonotonicQueue window = new MonotonicQueue();List<Integer> res = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (i < k - 1) {// Fill the front k-1 of the window firstwindow.push(nums[i]);} else {// The window slides forward to add a new numberwindow.push(nums[i]);// Record the maximum value of the current windowres.add(window.max());// Remove old numberswindow.pop(nums[i - k + 1]);}}// Needs to be converted to an int[] array and returnedint[] arr = new int[res.size()];for (int i = 0; i < res.size(); i++) {arr[i] = res.get(i);}return arr;}
}

http://www.ppmy.cn/embedded/43194.html

相关文章

CLIP 论文的关键内容

CLIP 论文整体架构 该论文总共有 48 页&#xff0c;除去最后的补充材料十页去掉&#xff0c;正文也还有三十多页&#xff0c;其中大部分篇幅都留给了实验和响应的一些分析。 从头开始的话&#xff0c;第一页就是摘要&#xff0c;接下来一页多是引言&#xff0c;接下来的两页就…

【Rust日报】函数指针与闭包的区别

函数指针与闭包的区别 在 Rust 中&#xff0c;函数指针用于直接指向一个确定签名的函数&#xff0c;适用于不需要捕获外部环境的场景。相对闭包来说&#xff0c;函数指针语法简单&#xff0c;性能略高但不能保持状态。闭包则功能更强大&#xff0c;能够捕获和使用其定义时的环境…

Day01-python函数

目录 一、函数介绍 二、函数使用 2-1 语法格式 2-2 函数的基本定义和使用 2-3 函数参数 2-4 参数接收数据类型 2-5 函数的返回值 2-6 函数的文档 2-7 函数的嵌套调用 三、变量作用域 3-1 变量的引用 3-2 变量的分类 四、函数参数详解 五、函数的数据传递 5-1 将函…

C++ | Leetcode C++题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* connect(Node* root) {if (root nullptr) {return root;}// 从根节点开始Node* leftmost root;while (leftmost->left ! nullptr) {// 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next…

Python实现对Word文档内容出现“重复标题”进行自动去重(3)

前言 本文是该专栏的第3篇,后面会持续分享Python办公自动化干货知识,记得关注。 在本文中,笔者将针对word文档(docx格式)的正文内容中的“标题”,进行自动去重。具体怎么实现,笔者接下来结合实际案例进行详细说明。 如上图所示,有时候word文档的标题出现重复显示,而现…

无线蓝牙耳机品牌推荐:倍思M2s Pro,让旅途更添乐趣

随着端午节的临近,许多人开始规划起出游计划。出游除了要做好行程安排,还需准备一些实用的物品来提升旅途的舒适度。特别是在高铁等长途旅行中,一款优质的降噪蓝牙耳机无疑是消磨时光、享受音乐的绝佳选择。那么,在众多的无线蓝牙耳机品牌中,有哪些值得推荐的呢?今天,我们就来…

03-02-Vue组件之间的传值

前言 我们接着上一篇文章 03-01-Vue组件的定义和注册 来讲。 下一篇文章 04-Vue&#xff1a;ref获取页面节点–很简单 父组件向子组件传值 我们可以这样理解&#xff1a;Vue实例就是一个父组件&#xff0c;而我们自定义的组件&#xff08;包括全局组件、私有组件&#xff09;…

一个普通双非女生的秋招之路

大家好&#xff0c;我是小布丁。 先简单地做个自我介绍&#xff1a; 我今年本科毕业于某双非院校&#xff08;属于那种没什么人听说过的小学校&#xff09;&#xff0c;学的是计算机专业&#xff0c;英语四级水平&#xff08;没办法&#xff0c;六级确实没过&#xff09;。我本…