【LeetCode】—— 滑动窗口最大值
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
示例 1:
输入: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
示例 2:
输入:nums = [1], k = 1 输出:[1]
示例 3:
输入:nums = [1,-1], k = 1 输出:[1,-1]
示例 4:
输入:nums = [9,11], k = 2 输出:[11]
示例 5:
输入:nums = [4,-2], k = 2 输出:[4]
1 class Solution { 2 public int[] maxSlidingWindow(int[] nums, int k) { 3 // 优先队列,并构造比较器,最大堆;放入二维数组,第一维存值,第二维存index位置 4 PriorityQueue<int[]> queue = new PriorityQueue<int []>(new Comparator<int[]>() { 5 @Override 6 public int compare(int[] o1, int[] o2) { 7 return o2[0]==o1[0]?o2[1]-o1[1]:o2[0]-o1[0]; 8 } 9 }); 10 // 前第一个滑动窗口塞入 11 for (int i=0;i<k;i++){ 12 queue.offer(new int[]{nums[i],i}); 13 } 14 // 返回数组 15 int[]ans = new int[nums.length-k+1]; 16 ans[0] = queue.peek()[0]; 17 // 遍历后面的滑动窗口 18 for (int i=k;i<nums.length;i++){ 19 // 先塞到最大堆里 20 queue.offer(new int[]{nums[i],i}); 21 // 排除栈顶不符合规范的数值,也就是不属于滑动窗口,在窗口左侧的数值 22 while (queue.peek()[1] <= i-k){ 23 queue.poll(); 24 } 25 ans[i-k+1]=queue.peek()[0]; 26 } 27 return ans; 28 } 29 }
解题关键:
最大堆,优先队列