码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 算法通关村16关 | 堆与滑动窗口问题结合


    1. 堆与滑动窗口问题结合

    题目

    LeetCode239 给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,你可以看到在滑动窗口内的k个数字,滑动窗口每次只向右移动一位,返回滑动窗口中的最大值。

    思路

    对于最大值、k个最大值这种场景,优先队列(堆)是首先应该考虑的思路。大根堆可以帮我们实时维护一系列中的最大值。

            把nums中前k个元素放入队中,作为初始值,第一个最大值就可以知道了,每次向右移动滑动窗口的时候,我们可以取出其中的最大值,当然最大值不一定在滑动窗口中的第一个元素,(如图中第6行第7行)因为窗口的大小固定,所以最多k-1次移动取出最大值,最少直接在首位取出,所以堆的大小其实是固定的,并不会太大,因为我们需要知道堆中元素在数组中的索引位置,索引存储二元数组(num,index)。

    整个过程大概就是边向右滑动边取出最大值的过程,当pq.peek()[1] <= i - k的时候,最大的元素是在窗口左端的左侧,在窗口外面,需要删除。

    代码

    1. public int[] maxSlidingWindow(int[] nums, int k){
    2. int n = nums.length;
    3. PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>() {
    4. @Override
    5. public int compare(int[] o1, int[] o2) {
    6. //正数单调递减
    7. return o1[0] != o2[0] ? o2[0] - o1[0] : o2[1] - o1[1];
    8. }
    9. });
    10. for (int i = 0; i < k; i++) {
    11. pq.offer(new int[]{nums[i],i});
    12. }
    13. int[] ans = new int[n - k + 1];
    14. //第一个最大值
    15. ans[0] = pq.peek()[0];
    16. for (int i = k; i < n; i++) {
    17. pq.offer(new int[]{nums[i],i});
    18. //判断最大值是否是窗口的第一个元素,是第一个元素因为窗口需要向前滑动,窗口大小固定,所以窗口中第一个元素需要移除
    19. while (pq.peek()[1] <= i - k){
    20. pq.poll();
    21. }
    22. ans[i - k + 1] = pq.peek()[0];
    23. }
    24. return ans;
    25. }

  • 相关阅读:
    正则表示式——6.处理比较复杂的正则表示法
    spark集成hudi
    Redis 在 vivo 推送平台的应用与优化实践
    基于STM32结合CubeMX学习Free-RT-OS的源码之两类中断解析
    【java学习—九】工厂方法FactoryMethod(6)
    Vue2高级-nextTick、过渡与动画
    (208)Verilog HDL:时钟双沿触发器
    三面(技术+HR面试)网易,分享我的面试经验!(已拿offer)
    Servlet入门接口、类和配置学习
    yolov5的口罩识别系统+GUI界面 (附代码)
  • 原文地址:https://blog.csdn.net/m0_54138535/article/details/132683518
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号