题目描述:给定一个数组数字,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口看到k个数字。每次滑动窗口右移一个位置。返回最大滑动窗口。
Example:
Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
Output: [3,3,5,5,6,7]
Explanation:
package Algorithm.LeetCode.T239;import java.util.Arrays;
import java.util.PriorityQueue;/*** 返回滑动窗口中的最大值** @author wangfei*/
public class Solution {
/*** 注:Java中默认优先队列就是小顶堆,且一个数越大其相反数越小* 1.创建一个优先队列,将前两个数组元素的相反数放入优先队列中* 2.遍历数组中其余元素的相反数依次放入优先队列构建小顶堆* 3.将堆顶元素的相反数(即原数组中的数)存入max数组中** @param nums* @param k* @return*/public static int[] maxSlidingWindow(int[] nums, int k) {
if (k <= 0)return new int[0];PriorityQueue<Integer> queue = new PriorityQueue<>();for (int i = 0; i < k - 1; i++) {
queue.add(-nums[i]);}int[] max = new int[nums.length - k + 1];for (int i = 0, j = k - 1; j < nums.length; i++, j++) {
queue.add(-nums[j]);max[i] = -queue.peek();queue.remove(-nums[j - k + 1]);}return max;}public static void main(String[] args) {
int[] nums = {
1, 3, -1, -3, 5, 3, 6, 7};int k = 3;System.out.print(Arrays.toString(maxSlidingWindow(nums, k)));}
}