题目描述:
方法一:暴力 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