带你读《图解算法小抄》十八、队列(2)

简介: 带你读《图解算法小抄》十八、队列(2)

带你读《图解算法小抄》十八、队列(1)https://developer.aliyun.com/article/1348049?groupCode=tech_library


2. 滑动窗口的最大值

给定一个整数数组nums和一个整数k,请找出数组中所有滑动窗口大小为k的子数组的最大值。

 

示例:

 

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释:

 

  • 窗口位置 最大值
  • [1 3 -1] -3 5 3 6 7 3
  • 1 [3 -1 -3] 5 3 6 7 3
  • 1 3 [-1 -3 5] 3 6 7 5
  • 1 3 -1 [-3 5 3] 6 7 5
  • 1 3 -1 -3 [5 3 6] 7 6
  • 1 3 -1 -3 5 [3 6 7] 7

 

1题目分析与解题步骤:

这个问题可以使用队列来解决。我们可以使用一个双端队列来存储滑动窗口中的元素,并保持队列中的元素按照降序排列。

 

解题步骤如下:

  • 创建一个双端队列queue,用于存储滑动窗口中的元素索引。
  • 遍历数组nums,并执行以下操作:
  • 在添加新元素之前,先检查队列queue的头部元素是否超出滑动窗口范围。如果超出,则将头部元素移除。
  • 然后,比较新元素与队列queue尾部元素所对应的数组元素的大小。如果新元素大于等于尾部元素,则将尾部元素移除,直到队列queue为空或者新元素小于尾部元素。
  • 将新元素的索引添加到队列queue的尾部。
  • 如果当前窗口已经达到大小k,则将队列queue头部元素所对应的数组元素作为当前窗口的最大值。

 

  • 遍历完整个数组后,我们将得到所有滑动窗口的最大值数组。

2JavaScript解题框架:

function maxSlidingWindow(nums, k) {
  const result = [];
  const queue = new Deque();
  for (let i = 0; i < nums.length; i++) {
    // 检查队列头部元素是否超出滑动窗口范围
    if (!queue.isEmpty() && queue.front() <= i - k) {
      queue.pop();
    }    // 比较新元素与队列尾部元素所对应的数组元素的大小
    while (!queue.isEmpty() && nums[i] >= nums[queue.items[queue.items.length - 1]]) {
      queue.pop();
    }    // 添加新元素的索引到队列尾部
    queue.push(i);    // 当窗口达到大小 k 时,将队列头部元素所对应的数组元素作为当前窗口的最大值
    if (i >= k - 1) {
      result.push(nums[queue.front()]);
    }
  }  
return result;
}

 

在这个框架中,我们使用一个双端队列 Deque 来实现滑动窗口最大值的计算。双端队列中存储的是数组元素的索引,而不是元素本身。

 

通过遍历数组 nums,我们依次将每个元素加入队列,并维护队列中的元素按照降序排列的规则。

 

在每次遍历过程中,我们检查队列头部元素是否超出滑动窗口范围,并将超出范围的元素移除。然后,我们比较新元素与队列尾部元素所对应的数组元素的大小,并移除比新元素小的尾部元素,以保持队列的降序特性。

 

当窗口大小达到 k 时,我们将队列头部元素所对应的数组元素作为当前窗口的最大值,并将其添加到结果数组 result 中。


带你读《图解算法小抄》十八、队列(3)https://developer.aliyun.com/article/1348047?groupCode=tech_library

相关文章
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
6月前
|
存储 算法
【数据结构和算法】--队列的特殊结构-循环队列
【数据结构和算法】--队列的特殊结构-循环队列
35 0
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
26 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
4月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
4月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
20 0
|
4月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
36 0
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
6月前
|
算法
【C/数据结构和算法】:栈和队列
【C/数据结构和算法】:栈和队列
52 1