仿牌网站,长沙本地网站推广,杭州网页设计公司,租房网站大家好我是苏麟 , 今天带来一道小题 .
滑动窗口最大值
描述 :
给你一个整数数组 nums#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
题目 :
…大家好我是苏麟 , 今天带来一道小题 .
滑动窗口最大值
描述 :
给你一个整数数组 nums有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
题目 :
LeetCode 239.滑动窗口最大值 :
239. 滑动窗口最大值 分析 :
这种方法我们在基础算法的堆部分介绍过。对于最大值、K个最大这种场景优先队列(堆)是首先应该考虑的思路。大根堆可以帮助我们实时维护一系列元素中的最大值。 本题初始时我们将数组 nums 的前 k个元素放入优先队列中。每当我们向右移动窗口时我们就可以把一个新的元素放入优先队列中此时堆顶的元素就是堆中所有元素的最大值。然而这个最大值可能并不在滑动窗口中在这种情况下这个值在数组 nums 中的位置出现在滑动窗口左边界的左侧。因此当我们后续继续向右移动窗口时这个值就永远不可能出现在滑动窗口中了我们可以将其永久地从优先队列中移除。
我们不断地移除堆顶的元素直到其确实出现在滑动窗口中。此时堆顶元素就是滑动窗口中的最大值。为了方便判断堆顶元素与滑动窗口的位置关系我们可以在优先队列中存储二元组(numindex)表示元素num 在数组中的下标为index。
解析 :
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n nums.length;PriorityQueueint[] pq new PriorityQueue(new Comparatorint[](){public int compare(int[] a,int[] b){return a[0] ! b[0] ? b[0] - a[0] : b[1] - a[1];}});for(int i 0;i k; i){pq.offer(new int[]{nums[i],i});}int[] arr new int[n - k 1];arr[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();}arr[i - k 1] pq.peek()[0];}return arr;}
}
这期就到这里 , 下期见!