首页 > 其他分享 >滑动窗口最大值-力扣

滑动窗口最大值-力扣

时间:2024-06-05 21:34:20浏览次数:19  
标签:nums int 最大值 back 力扣 que push 滑动 dq

在做这道题时,首先想到的解法是使用队列来做,维护一个队列,每次保存滑动窗口大小的长度,并判断此时队列中的最大值,但这样做,在k的值较大时,出现了超时问题,代码如下:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> result;
        queue<int> que;
        for(int i = 0; i < nums.size(); i++){
            que.push(nums[i]);
            while(que.size() == k){
                int maxNum = que.front();
                que.pop();
                que.push(maxNum);
                for(int flag = 0; flag < k - 1; flag++){
                    int tmp = que.front();
                    maxNum = max(maxNum, tmp);
                    que.pop();
                    que.push(tmp);
                }
                result.push_back(maxNum);
                que.pop();
            }
        }
        return result;
    }
};

使用deque双端队列来完成这道题,首先遍历前k个元素,将最大值的下标加入到队列中,如果新加入的下标对应的值大于队列前面下标对应的值,将其移除。这样保持这个队列维护的下标,对应的值时由大到小单调的。
之后每新插一个元素进来,继续维护这个单调的队列,然后判断队列最前的下标,是否还在滑动窗口内,如果不在,则移除。代码如下:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> result;
        deque<int> dq;
        for(int i = 0; i < k; i++){
            while(!dq.empty() && nums[i] >= nums[dq.back()]){
                dq.pop_back();
            }
            dq.push_back(i);
        }
        result.push_back(nums[dq.front()]);
        for(int i = k; i < nums.size(); i++){
            while(!dq.empty() && nums[i] >= nums[dq.back()]){
                dq.pop_back();
            }
            dq.push_back(i);

            while(dq.front() <= i - k){
                dq.pop_front();
            }
            result.push_back(nums[dq.front()]);
        }
        return result;
    }
};

标签:nums,int,最大值,back,力扣,que,push,滑动,dq
From: https://blog.csdn.net/why_12134/article/details/139423256

相关文章

  • 二叉树的中序遍历-力扣
    二叉树的中序遍历,指首先遍历左节点,然后遍历中间节点,最后遍历右节点,按照这个顺序进行递归即可。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullp......
  • 二叉树的层序遍历-力扣
    本题是二叉树的层序遍历,通过一个队列来控制遍历的节点,二叉树每层的节点和上一层入队的节点个数是相同的,根据这一点编写循环条件。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*......
  • 前K个高频元素-力扣
    本题想到的解法是使用哈希表首先统计数组中每个元素出现的次数,然后对出现次数进行排序,最后进行输出。看了题解学习到使用优先级队列小顶堆来完成,小顶堆的排序规则由自己来定义。代码如下:classSolution{public:classMyComparison{public:booloper......
  • 力扣刷题--2553. 分割数组中数字的数位【简单】
    题目描述给你一个正整数数组nums,请你返回一个数组answer,你需要将nums中每个整数进行数位分割后,按照nums中出现的相同顺序放入答案数组中。对一个整数进行数位分割,指的是将整数各个数位按原本出现的顺序排列成数组。比方说,整数10921,分割它的各个数位得到[1,0......
  • CSS 头部固定,中间滑动
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width......
  • 力扣 41.缺少的第一个正整数
    题目描述:给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例1:输入:nums=[1,2,0]输出:3解释:范围[1,2]中的数字都在数组中。示例2:输入:nums=[3,4,-1,1]输出:2解释:1......
  • 力扣-1049. 最后一块石头的重量 II
    1.题目题目地址(1049.最后一块石头的重量II-力扣(LeetCode))https://leetcode.cn/problems/last-stone-weight-ii/题目描述有一堆石头,用整数数组 stones表示。其中 stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分......
  • 【每周例题】 C++ 力扣 优势洗牌
    优势洗牌题目优势洗牌 题目分析1.采用双指针方法进行匹配2.依照题目所说,采用索引,首先需要填充索引,然后对索引进行升序排序。2.使用双指针进行匹配如果nums1[idx1[i]](即当前nums1中的元素)大于nums2[idx2[left]](即nums2中的当前最小元素),则将nums1[idx1[i]]赋值给ans[idx2[......
  • 【每日一算法】所有元素的 最大值 和 最大公约数 相等
    题目描述Silencer76 定义一个序列是好序列,当且仅当序列中所有元素的最大值和最大公约数相等。给定一个长度为 n的正整数序列 a,请找出最长的符合好序列定义的子序列,输出它的长度。输入描述:输出描述:示例一输入512321输出2示例说明:根据题意,子序......
  • 【每周例题】C++ 力扣 旋转字符串
    旋转字符串 题目旋转字符串 题目分析方法1:模拟字符串1.采用双for循环去模拟字符串旋转,第一个for循环,模拟字符串循环位移;第二个for循环,进行逐个字符串检测2.使用if进行判断是否符合要求方法2:假设我们将goal字符串拆分为2个字符串,将其命名为R、L,我们将会得到以下式子go......