首页 > 编程语言 >C++算法练习-day26——239.滑动窗口的最大值

C++算法练习-day26——239.滑动窗口的最大值

时间:2024-10-30 14:49:57浏览次数:3  
标签:day26 窗口 最大值 元素 C++ 239 数组 滑动 堆中

题目来源:. - 力扣(LeetCode)

题目思路分析

题目: 给定一个整数数组 nums 和一个整数 k,请找出该数组中所有长度为 k 的子数组中的最大元素,并返回这些最大元素组成的数组。

思路:

  1. 滑动窗口: 这是一个典型的滑动窗口问题,其中窗口的大小为 k。我们需要遍历整个数组,同时保持一个窗口,窗口的大小固定为 k,并找出每个窗口中的最大值。

  2. 最大堆: 为了高效地找到窗口中的最大值,我们可以使用最大堆(优先队列)来存储窗口中的元素。最大堆的顶部始终是堆中的最大值,这可以帮助我们快速获取窗口的最大值。

  3. 堆的维护: 当窗口向右滑动时,我们需要从堆中移除窗口左侧的元素(即超出当前窗口范围的元素)。为了确保堆中只包含当前窗口内的元素,我们需要在堆中存储元素的索引,以便判断元素是否仍在窗口内。

代码:

#include <vector>  
#include <queue>  
using namespace std;  
  
class Solution {  
public:  
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {  
        int n = nums.size(); // 数组的长度  
        priority_queue<pair<int, int>> q; // 最大堆,存储<值, 索引>对  
  
        // 初始化窗口  
        for (int i = 0; i < k; ++i) {  
            q.emplace(nums[i], i); // 将前k个元素加入堆中  
        }  
        vector<int> ans = {q.top().first}; // 第一个窗口的最大值  
  
        // 滑动窗口  
        for (int i = k; i < n; ++i) {  
            q.emplace(nums[i], i); // 将新元素加入堆中  
  
            // 移除堆中不在当前窗口内的元素  
            while (q.top().second <= i - k) {  
                q.pop();  
            }  
  
            // 记录当前窗口的最大值  
            ans.push_back(q.top().first);  
        }  
  
        return ans;  
    }  
};

注释详解:

  • priority_queue<pair<int, int>> q;:创建一个最大堆,用于存储<值, 索引>对。
  • q.emplace(nums[i], i);:将元素及其索引加入堆中。
  • ans = {q.top().first};:初始化结果数组,第一个元素为第一个窗口的最大值。
  • while (q.top().second <= i - k):循环移除堆中不在当前窗口内的元素。
  • ans.push_back(q.top().first);:记录当前窗口的最大值。

知识点摘要

  1. 滑动窗口: 一种用于处理数组或字符串中连续子数组/子串问题的技术。
  2. 最大堆(优先队列): 一种数据结构,用于高效地找到最大值或最小值。
  3. 堆的维护: 通过索引判断堆中的元素是否仍在窗口内,从而维护堆的正确性。

通过上述分析,我们了解到了如何使用最大堆(优先队列)来解决滑动窗口问题中的最大值问题。这种方法的关键在于使用索引来确保堆中只包含当前窗口内的元素。这种方法不仅高效,而且易于理解。在实际应用中,滑动窗口和优先队列的组合非常常见,尤其是在处理数组或字符串中的连续子数组/子串问题时。希望这篇文章能帮助你更好地理解这一技巧,并在未来的编程中加以应用。

标签:day26,窗口,最大值,元素,C++,239,数组,滑动,堆中
From: https://blog.csdn.net/L613Z/article/details/142964431

相关文章

  • C++算法练习-day27——347.前k个高频元素
    题目来源:.-力扣(LeetCode)题目思路分析题目:找出数组中出现频率最高的前K个元素。这个问题要求我们从给定的数组nums中找出频率最高的前k个元素。这通常意味着我们需要统计每个元素的出现次数,然后根据这些次数进行排序,并提取前k个元素。以下是解决这个问题的思路:统计频率:首......
  • 探索C++的类与继承之美:从基础到高级
    C++是一种强大的面向对象编程语言,其特性允许开发者利用类和继承来构建复杂的数据结构和功能。在本篇博客中,我们将通过一些示例代码,详细解析C++中的类、继承、虚继承、访问控制以及多重继承的概念。类的定义与基本特性类是C++的基本构建块,允许我们定义一个新的数据类型,该类型......
  • 239. 滑动窗口最大值(难)
    目录题目法一、暴力枚举法二、双端队列题目给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。法一、暴力枚举遍历数组,获取每个窗口的子数......
  • C++接口集成、身份实名认证-游戏防沉迷,保障未成年人健康
    随着互联网的快速发展,网络游戏在年轻人中越来越受欢迎。然而,未成年玩家长时间沉迷游戏的问题却引发了社会的广泛关注。为了应对这一现象,各大网络游戏平台纷纷引入翔云身份证实名认证接口,以有效辨别用户身份,建立完善的防沉迷系统,从而更好地保护未成年玩家的身心健康。......
  • 【C++】string 类深度解析:探秘字符串操作的核心
     快来参与讨论......
  • 我接触csdn中的c++的时间
    大家好,我是AC使者,不知不觉我也来到CSDN半年了!在这半年我也看到了自身的不足,我也还有了很多粉丝,所以我今天来总结一下这半年的东西。第一篇--------结构体数组关于结构体数组的理解-CSDN博客第二篇--------字符串C05.L06.字符串合并_c++字符串合并-CSDN博客第三篇--------......
  • C++练习:股票买卖的最佳时机(1~4)
    121.买卖股票的最佳时机简介这是一道简单题,思路是找卖出那一天前的最低价格,然后记录卖出后的最大利润。按照动态规划的思路解题,我们需要找到原问题和子问题的转移关系。分析:n天内的最大利润,一定是1~n内某一天卖出股票的最大利润。我们知道要使我们手中的股票得到最大利润,就......
  • list(c++)
    list介绍list是STL容器中的容器,且元素在容器中的位置是分散的并与大小无关。list的底层是双向链表,其优势是在任意位置插入和删除元素的时间复杂度为O(1),但无法通过“下标[]”直接访问元素,需要通过从头(尾)遍历元素找到元素,多用于需要大量数据的插入和删除,且对数据的随机访问比......
  • 基于 C++ 的 UG/NX 二次开发环境配置
    基于C++的UG/NX二次开发环境配置参考教程:UG/NX二次开发环境配置方法(nx1980+vs2019)-CSDN博客NX二次开发VS环境搭建-怡宁塑胶模具设计-博客园(cnblogs.com)NX/UG二次开发环境配置方法—史上最详细版(以NX11.0和VisualStudio2017为例)_nx二次开发-CSDN博客在Windows......
  • C++:日期类的实现
      目录一.日期类1.类的构造函数和拷贝构造2.日期的比较3.日期加减一个天数1.日期加天数2.日期减天数4.日期的++与--1.日期的++2.日期的--5.日期减日期6.日期的输入和输出二.整体代码1.Date.h2.Date.cpp      在前面几节的内容中,我们学习了类的基本......