思路:
优先队列
代码:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n=nums.length;
//int[]数组中0为元素,1为下标
PriorityQueue<int[]> queue=new PriorityQueue<int[]>(new Comparator<int[]>(){
public int compare(int[] a,int[] b){
if(a[0]==b[0]){
//若值相等,则下标降序排列
return b[1]-a[1];
}
else{
//降序排列
return b[0]-a[0];
}
}
});
//把前k个压入优先队列
for(int i=0;i<k;i++){
//注意:不是直接写(nums[i],i)
queue.offer(new int[]{nums[i],i});
}
int[] res=new int[n-k+1];
res[0]=queue.peek()[0];
for(int i=k;i<n;i++){
queue.offer(new int[]{nums[i],i});
while(queue.peek()[1]<i-k+1){
queue.poll();
}
res[i-k+1]=queue.peek()[0];
}
return res;
}
}
分解:
1)维护优先队列中的k个元素:
把最新的值加入,判断是不是队头元素的下标小于该滑动窗口的最左边的下标,是则弹出,是while操作而不是if,因为队头元素不一定是最左边的元素,排过序了
2)注意:不是直接写(nums[i],i)
queue.offer(new int[]{nums[i],i});
复杂度分析:
时间复杂度:O(N)每个元素都要遍历
空间复杂度:O(K)队列中一直都是k个元素