LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位,返回滑动窗口中的最大值。
输入:nums=[1,3,-1,-3,5,3,6,7],k=3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [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) {
int n = nums.length;
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
public int compare(int[] pair1, int[] pair2) {
return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
}
});
for (int i = 0; i < k; i++) {
pq.offer(new int[]{nums[i], i});
}
int[] ans = new int[n - k + 1];
ans[0] = pq.peek()[0];
for (int i = k; i < n; i++) {
pq.offer(new int[]{nums[i], i});
while (pq.peek()[1] <= i - k) {
pq.poll();
}
ans[i - k + 1] = pq.peek()[0];
}
return ans;
}
优先队列中每个值存储的是一个包含元素值和对应索引的数组 [元素值, 索引]
。在这段代码中,优先队列 pq
存储的是这样的数组。
pq.peek()[1] <= i - k
-
表示队首元素的索引值是否小于等于当前滑动窗口的起始索引。文章来源:https://www.toymoban.com/news/detail-681720.html
-
如果队首元素的索引值小于等于当前滑动窗口的起始索引,则说明该元素已经不在当前滑动窗口的范围内,需要将其从优先队列中移除。文章来源地址https://www.toymoban.com/news/detail-681720.html
到了这里,关于算法通关村第十六关——滑动窗口与堆结合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!