首页 > 其他分享 >LeetCode 239. 滑动窗口最大值

LeetCode 239. 滑动窗口最大值

时间:2023-05-14 19:00:12浏览次数:45  
标签:下标 窗口 nums 队列 最大值 239 滑动 LeetCode

题目链接:LeetCode 239. 滑动窗口最大值

题意:

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

解题思路:

(单调队列) O(n)

使用单调队列求解滑动窗口中的最大值。其中,单调队列是一个普通的双端队列,即队头和队尾都可以添加和弹出元素。我们假设该双端队列的 队头 是整个队列的最大元素所在下标,至 队尾 下标代表的元素值依次降低。
初始时单调队列为空。随着对数组的遍历过程中,每次插入元素前,需要考察两个事情:
(1). 合法性检查:队头下标如果距离 i 超过了 k ,则应该出队。
(2). 单调性维护:如果 nums[i] 大于或等于队尾元素下标所对应的值,则当前队尾再也不可能充当某个滑动窗口的最大值了,故需要队尾出队。始终保持队中元素从队头到队尾单调递减。
如次遍历一遍数组,队头就是每个滑动窗口的最大值所在下标。
时间复杂度
遍历中,每个元素最多进队一次,出队一次,故时间复杂度为 O(n)。
空间复杂度
需要额外 O(n) 的空间存储单调队列。

完整代码如下:

func maxSlidingWindow(nums []int, k int) []int {
    // 单调队列的思想  只要右边的数比左边的大,那么左边的就没有意义,可以直接去掉

    var q []int   //存放滑动窗口中的数的下标
    var res []int   //存放结果
    for i:=0;i<len(nums);i++{

        if len(q)>0 && i-k+1 > q[0]{   //i-k+1表示滑动窗口的左边界,左边界的下标大于q[0],说明q[0]应该退出滑动窗口
            q = q[1:]
        }
        for len(q)>0 && nums[i] >= nums[q[len(q)-1]] {  
            //如果当前nums[i]的值大于队尾 nums[q[len(q)-1]]的值,则删除队尾元素,当前值入队列。
            //因为是求滑动窗口最大值,因此如果当前的值比已经在队列中的值小,则永远不可能成为最大值,直接过滤掉即可
            q = q[:len(q)-1]
        }
        q = append(q,i)  //将当前元素的下标加入

        if i >=k-1{
            res = append(res,nums[q[0]])
        }
    }
    return res
}

标签:下标,窗口,nums,队列,最大值,239,滑动,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17399899.html

相关文章

  • LeetCode 150. 逆波兰表达式求值
    题目链接:LeetCode150.逆波兰表达式求值题意:给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。解题思路:(栈操作)O(n)遍历所有元素。如果当前元素是整数,则压入栈;如果是运算符,则将栈顶两个元素弹出......
  • LeetCode 1047. 删除字符串中的所有相邻重复项
    题目链接:LeetCode1047.删除字符串中的所有相邻重复项题意:给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。解题思路:开一个栈,然后扫描整个字符串。如果当前字符和栈顶元素不相等,则当前......
  • LeetCode 20. 有效的括号
    题目链接:LeetCode20.有效的括号题意:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。解题思路:括号匹配是栈的经典应用场景,具体操作如下:1.对于所有的左括号,进栈2.对于所有的右括号,弹出栈顶元素,判断是否与当前元素匹配,若不匹配,则returnfalse3.最后......
  • LeetCode --- 二叉树操作
    543. 二叉树的直径乍看是根节点的左子树最大高度+右子树最大高度+1但其实不能这样,因为路径可能并不经过根节点,如图二因此要用一个max来保存最后的最大路径和在求二叉树高度的递归中,在每个根节点(在递归函数中),比较max与以这个当前根节点的  左子树最大高度+右子......
  • 2023-05-14 leetcode竞赛
    6430. 找出转圈游戏输家mysolution100%passclassSolution:defcircularGameLosers(self,n:int,k:int)->List[int]:seen=set()now_num=1step=1seen.add(1)while1:stepSum=step*ktotal=......
  • leetcode 1604. 警告一小时内使用相同员工卡大于等于三次的人
    力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个警告 。给你字符串数组 keyName 和 keyTime,其中 [keyName[i],keyTime[i......
  • LeetCode 刷题 —— 辅助栈
     42. 接雨水classSolution{publicinttrap(int[]height){intres=0;Stack<Integer>leftWallStack=newStack();intlen=height.length;leftWallStack.push(0);for(inti=1;i<len;i++){......
  • #yyds干货盘点# LeetCode面试题:乘积最大子数组
    1.简述:给你一个整数数组nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位整数。子数组是数组的连续子序列。 示例1:输入:nums=[2,3,-2,4]输出:6解释: 子数组[2,3]有最大乘积6。示例......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的层序遍历
    题目:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。 示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]代码实现:classSolution{publicList<List<Integer>>......
  • 【LeetCode剑指offer#04】包含min函数的栈、栈的压入、弹出序列(辅助栈的应用)
    包含min函数的栈https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。示例:MinStackminStack=newMinStack();minStack.push(-2);......