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.csdn.net/liuwenyou/article/details/100535592