代码先锋网 代码片段及技术文章聚合

面试题59 - I. 滑动窗口的最大值

技术标签: leetcode  剑指offer

给定一个数组 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.deque介绍

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
版权声明:本文为weixin_43455338原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43455338/article/details/104630380

智能推荐

leetcode 剑指offer 面试题59 - I. 滑动窗口的最大值

题干: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 解题思路: 单调队列求解 设窗口区间为 [i, j] ,最大值为Xj,若窗口移动一格,则区间变成[i + 1, j + 1],添加了nums[j + 1],删除了nums[i]. 若只向右边边界添加一个nums[j + 1],最大值变成了原先窗口比较新添加的数那个大,通过一次对比O(1)实现。 但由于删除的num...

面试题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 5 1 3 -1 [-3 5 3] 6...

【leetcode-python-8】面试题59 - I. 滑动窗口的最大值

【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...

【Python】【难度:简单】Leetcode 面试题59 - I. 滑动窗口的最大值

给定一个数组 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. 滑动窗口的最大值 算法思想 思路 实现 面试题59 - I. 滑动窗口的最大值 题目链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 算法思想 滑动窗口、双端队列 思路 我们维护一个单调的双向队列,窗口在每次滑动的时候,我就从队列头部取...

猜你喜欢

面试题59 - I. 滑动窗口的最大值

面试题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...

面试题59:I. 滑动窗口的最大值

题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 方法一:暴力 两层循环,暴力求解 时间复杂度 O(nk) 空间复杂度 O(1) 方法二:双端队列 另外定义一个双端队列,队列里面存的顺序是当前滑动窗口的非递增顺序,如果新进来一个元素比其他元素都大,那么将队列清空,让这个元素进队 时间复杂度 O(n) 空间复杂度 O(n)...

面试题59 - I. 滑动窗口的最大值(239. 滑动窗口最大值)(Java)(单调队列)(滑动窗口)

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...

(Java算法)剑指offer-面试题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 ...