当前位置: 首页 > news >正文

算法通关村第十六关:黄金挑战:滑动窗口与堆结合

黄金挑战:滑动窗口与堆结合

堆的大小一般是有限的,能直接返回当前位置下的最大值或者最小值
该特征与滑动窗口结合,可以解决一些特定场景的问题

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

LeetCode239
https://leetcode.cn/problems/sliding-window-maximum/

思路分析

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

具体执行:

  • 先将数组的前K个元素放入大根堆中,此时最大值为堆顶元素
  • 每当窗口右移时,将新元素放入大根堆中,此时最大值可能不在滑动窗口中
    最大值为滑动窗口的前一个元素,此时需要将堆顶元素移除,直到堆顶元素在滑动窗口中
    最大值为滑动窗口中的元素,此时最大值就是堆顶元素
  • 为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在有限队列中存储二元组(num, index),表示元素 num 在数组中的下标为 index

代码实现

import heapqclass Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:n = len(nums)ans = []# 注意 Python 默认的优先队列是小根堆# pyhton 中(int,int)可正常比较大小 (1, 0) < (2, 0), (1, 0) < (1, 1)heap = [(-nums[i], i) for i in range(k)]heapq.heapify(heap)ans.append(-heap[0][0])for i in range(n-k):heapq.heappush(heap, (-nums[i+k], i+k))# 移除堆顶元素,直到堆顶元素在滑动窗口中while heap[0][1] <= i:heapq.heappop(heap)ans.append(-heap[0][0])return ans
http://www.lryc.cn/news/163190.html

相关文章:

  • 6.2.2 【MySQL】InnoDB中的索引方案
  • 划片机实现装片、对准、切割、清洗到卸片的自动化操作
  • OpenCV(二十五):边缘检测(一)
  • 上行取消指示 DCI format 2_4
  • 百望云蝉联2023「Cloud 100 China 」榜单 综合实力再获认可
  • 力扣刷题班第1节:Python语法常遗漏的知识
  • GET 和 POST请求的区别是什么
  • Python数据分析实战-表连接-merge四种连接方式用法(附源码和实现效果)
  • NFTScan 浏览器再升级:优质数据服务新体验来袭
  • C# 去除utf-8 BOM头
  • Java注解以及自定义注解
  • [开学季]ChatPaper全流程教程
  • Spring学习笔记——4
  • Python数据科学入门
  • Ubuntu 22.04 编译 DPDK 19.11 igb_uio 和 kni 报错解决办法
  • Android Studio.exe 下载 2023 最新更新,网盘下载
  • element的el-select给下拉框添加背景
  • 正确理解党籍和党龄;入党和转正时间
  • C语言基础:printf 函数介绍;以及常用四种常用的数据类型
  • 【LeetCode-中等题】209. 长度最小的子数组
  • 比较聚合模型实战文本匹配
  • LA@二次型@标准化相关原理和方法
  • Git与IDEA: 解决`dev`分支切换问题及其背后原因 为何在IDEA中无法切换到`dev`分支?全面解析!
  • 什么是JavaScript中的严格模式(strict mode)?应用场景是什么?
  • 红外特征吸收峰特征总结(主要基团的红外特征吸收峰)
  • ChatGPT AIGC 完成关联分析散点图的应用
  • CentOS7.6上实现Spring Boot(JAR包)开机自启
  • Java开发之框架(spring、springmvc、springboot、mybatis)【面试篇 完结版】
  • QT人脸识别知识
  • 熟悉Redis6