做瞹瞹爱视频网站北京vi设计招聘
news/
2025/9/24 6:42:43/
文章来源:
做瞹瞹爱视频网站,北京vi设计招聘,apt-get install wordpress,福建省住房和城乡建设厅官网滑动窗口与堆结合
堆与滑动窗口问题的结合 LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位#xff0c;返回滑动窗口中的最大值。 对于最大值、K个最大这种场… 滑动窗口与堆结合
堆与滑动窗口问题的结合 LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位返回滑动窗口中的最大值。 对于最大值、K个最大这种场景优先队列堆是首先应该考虑的思路。大根堆可以帮助我们实时维护一系列元素中的最大值。 本题初始时我们将数组nums的前k个元素放入优先队列中。每当我们向右移动窗口时我们就可以把一个新的元素放入优先队列中此时堆顶的元素就是堆中所有元素的最大值。然而这个最大值可能并不在滑动窗口中在这种情况下这个值在数组nums中的位置出现在滑动窗口左边界的左侧。因此当我们后续继续向右移动窗口时这个值就永远不可能出现在滑动窗口中了我们可以将其永久地从优先队列中移除。 我们不断地移除堆顶的元素直到其确实出现在滑动窗口中。此时堆顶元素就是滑动窗口中的最大值。为了方便判断堆顶元素与滑动窗口的位置关系我们可以在优先队列中存储二元组(num,index),表示元素num在数组中的下标为index。 代码如下 public int[] maxSlidingWindow(int[] nums, int k) {int n nums.length;// 优先级队列自定义排序器首先按照nums元素值进行降序排序如果元素值相等则按照数组下标值进行降序排序PriorityQueueint[] pq new PriorityQueueint[](new Comparatorint[](){public int compare(int[] pair1,int[] pair2){return pair1[0] ! pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];}});// 前k个元素入队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});// 因为已经排好序因此可以通过peek剔除掉当前队列中为最大值但非窗口中的的元素循环结束后则队首元素为当前队列中为最大值且是窗口中的元素while(pq.peek()[1]i-k){pq.poll();}ans[i - k 1] pq.peek()[0];}return ans;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915106.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!