【Golang】LeetCode 239. 滑动窗口最大值

239. 滑动窗口最大值

题目描述

思路

这道题是 LeetCode 当中的一道 Hard 题目,但其本质上是一个指定算法的模版题,这个算法就是基于双端队列实现的单调栈。

双端队列deque这种数据结构支持我们同时从队头和队尾对元素进行插入与弹出,我们使用它来维护一个单调栈,这个单调栈当中保存的元素是数组nums当中元素的下标,对于顺序(从左到右)保存在deque当中的两个下标ij,必须满足nums[i] > nums[j],这使得左侧队头对应的nums当中的元素一定是在当前单调栈当中最大的。

我们设置单调栈为dq,并开始对nums进行遍历。对于nums[i],我们想要在此次操作时将i插入到单调栈当中,这就需要为这个下标寻找一个合适的位置,使得整个单调栈满足下标所对应的元素从左至右单调递减。我们不断地比较队尾下标对应元素与nums[i]的大小,如果队尾元素更小,则直接将其弹出,它所对应数组当中的元素不再可能成为某个滑动窗口当中的最大值了,因为至少nums[i]一定是比它大的。基于这种方法我们可以为i找到其合适的位置。

然后,我们需要判断单调栈左侧的元素是否仍然在当前窗口内,比较的依据就是判断是否满足i - dq[0] < k - 1,如果不满足则弹出左侧元素,因为它已经不在窗口内了。

完成上面两个单调栈的维护操作之后,此时单调栈中的左侧元素对应的nums[dq[0]]就是滑动窗口当中的最大值。

基于以上思路,我们写代码来解决问题。

Golang 题解

go 复制代码
func maxSlidingWindow(nums []int, k int) []int {
    n := len(nums)
    dq, ans := []int{}, []int{}

    for i := 0; i < n; i ++ {
        for len(dq) > 0 && nums[i] > nums[dq[len(dq) - 1]] {
            dq = dq[:len(dq) - 1]
        }
        for len(dq) > 0 && i - dq[0] >= k {
            dq = dq[1:]
        }
        dq = append(dq, i)
        if i >= k - 1 {
            ans = append(ans, nums[dq[0]])
        }
    }
    
    return ans
}

Python 题解

python 复制代码
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n, dq, ans = len(nums), collections.deque(), []

        for i in range(n):
            while len(dq) > 0 and nums[i] > nums[dq[len(dq) - 1]]:
                dq.pop()
            while len(dq) > 0 and i - dq[0] >= k:
                dq.popleft()
            dq.append(i)
            if i >= k - 1:
                ans.append(nums[dq[0]])

        return ans
相关推荐
罗西的思考11 分钟前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客1 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
丰锋ff2 小时前
面试问题合集
面试·职场和发展
颜挺锐2 小时前
如何轻松通过性能测试之第四篇:性能测试项目怎么交付?一文讲透九步实施流程(附面试话术 + 实战清单)
面试·职场和发展
小白羊丨4 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F5 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper5 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-6 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台6 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰7 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展