leetcode-239-滑动窗口最大值

题目描述:

 方法一:暴力 O(nk)

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        if n*k == 0:
            return []
        return [max(nums[i:i+k]) for i in range(n-k+1)]

方法二:双端队列 O(N)

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        from collections import deque
        n = len(nums)
        if n*k == 0:
            return []
        if k == 1:
            return nums
        queue = deque()
        res = []
        for i in range(len(nums)):
            if queue and i-queue[0]+1>k:
                queue.popleft()
            while queue and nums[i]>nums[queue[-1]]:
                queue.pop()
            queue.append(i)
            if i+1>=k:
                res.append(nums[queue[0]])
        return res

方法三:动态规划:O(N)

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        if not nums: return []
        n = len(nums)
        left_max = [0] * n
        left_max[0] = nums[0]
        right_max = [0] * n
        right_max[-1] = nums[-1]
        res = []
        for i in range(1, n):
            left_max[i] = nums[i] if i % k == 0 else max(left_max[i - 1], nums[i])
        for i in range(n - 2, -1, -1):
            right_max[i] = nums[i] if i % k == 0 else max(right_max[i + 1], nums[i])
        i = 0
        while i + k - 1 < n:
            res.append(max(right_max[i], left_max[i + k - 1]))
            i += 1
        return res

猜你喜欢

转载自www.cnblogs.com/oldby/p/11650385.html