题目
给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};
针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度或窗口长度为0的时候,返回空。
数据范围: 1≤n≤10000,0≤size≤10000,数组中每个元素的值满足 ∣val∣≤10000。
要求:空间复杂度 O(n),时间复杂度 O(n)。
示例1
输入:[2,3,4,2,6,2,5,1],3
返回值:[4,4,6,6,6,5]
示例2
输入:[9,10,9,-7,-3,8,2,-6],5
返回值:[10,10,9,8]
示例3
输入:[1,2,3,4],5
返回值:[]
思路
用一个大顶堆,保存当前滑动窗口中的数据。滑动窗口每次移动一格,就将前面一个数出堆,后面一个数入堆。
代码
import java.util.*;
public class Solution {
public PriorityQueue<Integer> maxQueue = new PriorityQueue<Integer>((o1, o2) -> o2 - o1); //大顶堆
public ArrayList<Integer> result = new ArrayList<Integer>();//保存结果
public ArrayList<Integer> maxInWindows(int [] num, int size) {
if (num == null || num.length <= 0 || size <= 0 || size > num.length) {
return result;
}
int count = 0;
for (; count < size; count++) { //初始化滑动窗口
maxQueue.offer(num[count]);
}
while (count < num.length) { //对每次操作,找到最大值(用优先队列的大顶堆),然后向后滑动(出堆一个,入堆一个)
result.add(maxQueue.peek());
maxQueue.remove(num[count - size]);
maxQueue.add(num[count]);
count++;
}
result.add(maxQueue.peek());//最后一次入堆后没保存结果,这里额外做一次即可
return result;
}
}
该文章描述了一个编程问题,要求在给定数组和滑动窗口大小的情况下,找出所有滑动窗口内的最大值。解决方案是使用大顶堆,以O(n)的时间复杂度和空间复杂度找到结果。代码示例展示了如何初始化堆,处理每个窗口并更新最大值。
853

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



