Leetcode 239. Sliding Window Maximum

版权声明:Za七杂⑧ https://blog.csdn.net/weixin_35085773/article/details/86656313

题目描述:给出一个数组以及大小为k的滑动窗口,返回每个窗口中的最大值。

题目链接:Leetcode 239. Sliding Window Maximum

最简单的思路就是遍历然后用max函数返回最大值,但是这样的话每次都要遍历一次来找最大值。如果是笔试遇到可以这样做,如果是面试过程中就就应该提出一些更好的idea比如滑动过程中维护一个有序的窗口,画一格,加入的和退出的值。

大概思路是用双向队列保存数字的下标,遍历整个数组,如果此时队列的首元素是i - k的话,表示此时窗口向右移了一步,则移除队首元素。然后比较队尾元素和将要进来的值,如果小的话就都移除,然后此时我们把队首元素加入结果中即可。(这样队首永远是最大的,队尾不断加入,判断元素是否在窗口外、移动窗口达到窗口值时不断入结果)

代码如下

class Solution:
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        queue = []
        ans = []
        for idx in range(len(nums)):
            if (queue and queue[0] == idx-k): queue.pop(0)  #the element should be out
            while(queue and nums[queue[-1]] < nums[idx]): queue.pop()  #pop
            queue.append(idx)
            if (idx >= k-1): ans.append(nums[queue[0]])
        return ans

参考链接

猜你喜欢

转载自blog.csdn.net/weixin_35085773/article/details/86656313