给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例 1:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
| 滑动窗口的位置 | 最大值 |
|---|---|
| [1 3 -1] -3 5 3 6 7 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | 3 |
| 1 3 [-1 -3 5] 3 6 7 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 6 |
| 1 3 -1 -3 5 [3 6 7] | 7 |
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
queue = collections.deque()
result = []
for i in range(len(nums)):
if queue and queue[0] == i - k:
# 如果最大值在当前滑动窗口之外,去掉它
queue.popleft()
while queue and nums[queue[-1]] < nums[i]:
# 将小于当前元素的,全部从队列中推出
queue.pop()
queue.append(i) # 将当前元素加入队列
if i >= k - 1:
result.append(nums[queue[0]])
return result
来源:力扣(LeetCode)
collections 是 python 内建的一个集合模块,里面封装了许多集合类,其中队列相关的集合只有一个:deque。
deque 是双边队列(double-ended queue),具有队列和栈的性质,在 list 的基础上增加了移动、旋转和增删等。
常用方法:
d = collections.deque([])
d.append(‘a’) # 在最右边添加一个元素,此时 d=deque(‘a’)
d.appendleft(‘b’) # 在最左边添加一个元素,此时 d=deque([‘b’, ‘a’])
d.extend([‘c’,‘d’]) # 在最右边添加所有元素,此时 d=deque([‘b’, ‘a’, ‘c’, ‘d’])
d.extendleft([‘e’,‘f’]) # 在最左边添加所有元素,此时 d=deque([‘f’, ‘e’, ‘b’, ‘a’, ‘c’, ‘d’])
d.pop() # 将最右边的元素取出,返回 ‘d’,此时 d=deque([‘f’, ‘e’, ‘b’, ‘a’, ‘c’])
d.popleft() # 将最左边的元素取出,返回 ‘f’,此时 d=deque([‘e’, ‘b’, ‘a’, ‘c’])
d.rotate(-2) # 向左旋转两个位置(正数则向右旋转),此时 d=deque([‘a’, ‘c’, ‘e’, ‘b’])
d.count(‘a’) # 队列中’a’的个数,返回 1
d.remove(‘c’) # 从队列中将’c’删除,此时 d=deque([‘a’, ‘e’, ‘b’])
d.reverse() # 将队列倒序,此时 d=deque([‘b’, ‘e’, ‘a’])
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
queue = []
res = []
if len(nums) == 0:
return []
for i in nums:
if len(queue)<k:
queue.append(i)
contiue
res.append(max(queue))
queue.pop(0)
queue.append(i)
res.append(max(queue))
return res
题干: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 解题思路: 单调队列求解 设窗口区间为 [i, j] ,最大值为Xj,若窗口移动一格,则区间变成[i + 1, j + 1],添加了nums[j + 1],删除了nums[i]. 若只向右边边界添加一个nums[j + 1],最大值变成了原先窗口比较新添加的数那个大,通过一次对比O(1)实现。 但由于删除的num...
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6...
【leetcode-python-8】面试题59 - I. 滑动窗口的最大值 参考大佬版1(77.12%) 参考大佬版2(97.41%) 参考大佬版3(89.50%) leetcode 面试题59 - I. 滑动窗口的最大值 参考大佬版1(77.12%) 这种类型的题得用单调栈。这个版本没有用deque。 注:参考题解区Krahets思路。 参考大佬版2(97.41%) 唯一的不同是用了colle...
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 ---------...
面试题59 - I. 滑动窗口的最大值 面试题59 - I. 滑动窗口的最大值 算法思想 思路 实现 面试题59 - I. 滑动窗口的最大值 题目链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 算法思想 滑动窗口、双端队列 思路 我们维护一个单调的双向队列,窗口在每次滑动的时候,我就从队列头部取...
面试题59 - I. 滑动窗口的最大值 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7...
题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 方法一:暴力 两层循环,暴力求解 时间复杂度 O(nk) 空间复杂度 O(1) 方法二:双端队列 另外定义一个双端队列,队列里面存的顺序是当前滑动窗口的非递增顺序,如果新进来一个元素比其他元素都大,那么将队列清空,让这个元素进队 时间复杂度 O(n) 空间复杂度 O(n)...
1 题目 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5...
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 ...