239.Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Return the max sliding window.
Example:
Input: nums =[1,3,-1,-3,5,3,6,7], and k = 3 Output:[3,3,5,5,6,7] Explanation:Window position Max --------------- ----- [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
方法一:

public int[] maxSlidingWindow(int[] nums, int k) {
if(nums==null||nums.length<k||k==0){
return new int[0];
}
if(k==1){
return nums;
}
int len=nums.length;
int []ans=new int[len-k+1];
for(int i=0;i<k;i++){
ans[0]=Math.max(ans[0],nums[i]);
}
for(int i=k;i<len;i++){
if(ans[i-k]!=nums[i-k]){
ans[i-k+1]=Math.max(ans[i-k],nums[i]);
}else{
for(int j=i-k+1;j<=i;j++){
ans[i-k+1]=Math.max(ans[i-k+1],nums[j]);
}
}
}
return ans;
}
方法二:优先级队列: 来源 https://www.cnblogs.com/lightwindy/p/8661524.html

public int[] maxSlidingWindow(int[] nums, int k) {
if(nums==null||nums.length<k||k==0){
return new int[0];
}
if(k==1){
return nums;
}
PriorityQueue<Integer> queue=new PriorityQueue<Integer>(Collections.reverseOrder());
int len=nums.length;
int []ans=new int[len-k+1];
for(int i=0;i<len;i++){
if(i>=k){
queue.remove(nums[i-k]);
}
queue.offer(nums[i]);
if(i-k+1>=0){
ans[i-k+1]=queue.peek();
}
}
return ans;
}
优先级队列相关详解可查看:https://blog.youkuaiyun.com/liuwenyou/article/details/100535592
本文详细解析了滑动窗口最大值算法的两种实现方法,包括直接比较和使用优先级队列的方式,通过实例展示了如何求解给定数组中大小为k的滑动窗口的最大值。
477

被折叠的 条评论
为什么被折叠?



