边肖将与您分享LeetCode如何找出滑动窗口的最大值。相信大部分人还不太了解,所以分享这篇文章给大家参考。希望大家看完这篇文章后收获多多。让我们一起来发现吧!
00-1010给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口中的最大值。
00-1010输入: 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
00-1010考虑到这个问题的数组要求,头可以进,可以删,尾可以进,可以删,所以用的是得克得克。使用德格的单调的德格LinkedList实现。
所谓单调性,就是我们人为指定存储的元素从队列的头到尾依次递减(或递增)。
也就是说,我们维持着单调的双向队列。每次窗口滑动时,我都会从队列头取当前窗口中的最大值。每次窗口中出现一个元素,我都会将其大小与队列中的元素进行比较:
如果刚进来的元素比队列末尾的元素大,那么先弹出队列末尾的元素,再把刚进来的元素加到队列末尾;
如果刚进来的元素小于队列末尾的元素,只需将刚进来的元素直接添加到队列末尾。
因此,窗口的最大值可以通过这种可以从头部和尾部进出的结构来保持。
题目描述:
#-*-coding : utf-8-*-
类别解决方案:
defmaxInWindows(自身,数量,大小):
#writecodehere
#存储可能是最大值的下标
maxqueue=[]
#存储窗口中的最大值
maxlist=[]
n=透镜(数量)
#参数检查
ifn==0orsize==0orsizen:
returnmaxlist
foriirange(n):
#确定对应于队列头下标的元素是否滑出窗口。
iflen(max queue)0 Andi-size=max queue[0]:
(=NationalBureauofStandards)国家标准局
p; 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
java代码:
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怎样找出滑动窗口的最大值”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147019.html