小编给大家分享一下LeetCode怎样找出滑动窗口的最大值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
给定一个数组 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 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
考虑到这道题的数组要求可以头部进去、删除,尾部进去,删除,所以使用双端队列Deque。使用双端队列的单调双端队列LinkedList实现。
所谓的单调
,就是我们人为规定从队列的头部到尾部,所存储的元素是依次递减(或依次递增)的。
也就是说,我们维护一个单调的双向队列,窗口在每次滑动的时候,我就从队列头部取当前窗口中的最大值,每次窗口新进来一个元素的时候,我就将它与队列中的元素进行大小比较:
如果刚刚进来的元素比队列的尾部元素大,那么先将队列尾部的元素弹出,然后把刚刚进来的元素添到队列的尾部;
如果刚刚进来的元素比队列的尾部元素小,那么把刚刚进来的元素直接添到队列的尾部即可。
因此,通过这种既能从头部进出,又能从尾部进出的结构,来维持窗口的最大值的。
# -*- coding:utf-8 -*-class Solution: def maxInWindows(self, num, size): # write code here # 存放可能是最大值的下标 maxqueue = [] # 存放窗口中最大值 maxlist = [] n = len(num) # 参数检验 if n == 0 or size == 0 or size > n: return maxlist for i in range(n): # 判断队首下标对应的元素是否已经滑出窗口 if len(maxqueue) > 0 and i - size >= maxqueue[0]: maxqueue.pop(0) while len(maxqueue) > 0 and num[i] > num[maxqueue[-1]]: maxqueue.pop() maxqueue.append(i) if i >= size - 1: maxlist.append(num[maxqueue[0]]) return maxlist
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { Deque<Integer> deque=new LinkedList<>(); int len=nums.length; if(len==0 ||k==0 ){ return new int[0] ; } int[] res=new int[len-k+1]; for(int i=0;i<k;i++){ while(!deque.isEmpty() && nums[i]>deque.peekLast()){ deque.removeLast(); //比队列元素大就弹出队尾数据 } deque.addLast(nums[i]);//不走循环直接加到队列末尾 } res[0]=deque.peekFirst(); for(int i=k;i<len;i++){ // 如果滑动窗口已经略过了队列中头部的元素,则将头部元素弹出 if(deque.peekFirst() == nums[i - k]){ deque.removeFirst();// } while(!deque.isEmpty() && deque.peekLast() < nums[i]){ deque.removeLast(); } deque.addLast(nums[i]); res[i - k + 1] = deque.peekFirst(); } return res; }}
以上是“LeetCode怎样找出滑动窗口的最大值”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4597666/blog/4932339