public class Solution {
// 思路:使用一个队列来保存当前窗口内的可能出现的最大值的候选者 (看了discuss)
LinkedList<Integer> queue = new LinkedList<Integer>();
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k < 1) {
return new int[0];
}
ArrayList<Integer> maxValues = new ArrayList<Integer>();
int i = 0;
for (; i < nums.length && i < k; i++) {
insert2Queue(nums[i]);
}
maxValues.add(queue.get(0));
if (i == nums.length) { // nums.length <= k, 直接返回queue首部的值
return convert(maxValues);
}
for (int j = i; j < nums.length; j++) {
if (nums[j-k] == queue.peek()) {
queue.remove(0);
}
insert2Queue(nums[j]);
maxValues.add(queue.peek()); // 当前队列首部的元素是窗口中最大的值
}
return convert(maxValues);
}
// 插入队列,使用以下原则:移除队列中所有小于当前插入值val的值
private void insert2Queue(int val) {
LinkedList<Integer> tmpQueue = new LinkedList<Integer>();
if (queue.size() > 0) {
for (int i = 0; i < queue.size(); i++) {
if (queue.get(i) >= val) {
tmpQueue.add(queue.get(i));
}
}
}
tmpQueue.add(val);
queue = tmpQueue;
}
private int[] convert(List<Integer> values) {
if (values == null || values.size() == 0) {
return new int[0];
}
int[] rets = new int[values.size()];
int i = 0;
for (int val : values) {
rets[i++] = val;
}
return rets;
}
}
leetcode - [239] Sliding Window Maximum
最新推荐文章于 2022-04-20 21:57:46 发布