机试打卡 -12 滑动窗口最大值(优先队列堆)

news2024/7/4 4:53:27

 


 我的思路1:队列,每次 出队+入队,记录1个队列中的最大值索引,超时。。。

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        
        nums_len=len(nums)

        ans_list=[]
        
        # 队列长度为k
        queue=nums[:k]

        # 队列最大值索引
        max_index=queue.index(max(queue))
        ans_list.append(queue[max_index])

        for i in range(k,nums_len):

            # 出队
            del queue[0]
            max_index-=1

            # 入队
            queue.append(nums[i])

            # 判断队列最大值索引的状态
            # 若最大值索引移出,则重新判断标记最大值索引
            if max_index<0:
                max_index=queue.index(max(queue))

            # 若最大值索引未移出,则比较新进元素和队列标记数的大小
            else:
                if nums[i]>=queue[max_index]:
                    max_index=k-1
                else:
                    pass

            ans_list.append(queue[max_index])
                
        return ans_list

我的思路2:建立排序队列,每次 出队+入队,采用 折半搜索,超时。。。

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        
        nums_len=len(nums)

        ans_list=[]

        if k==1:
            return nums
        
        # 队列长度为k
        queue=nums[:k]

        # 排序队列 sorted_queue
        sorted_queue=sorted(queue)

        ans_list.append(sorted_queue[-1])

        for i in range(k,nums_len):

            # 出队
            del sorted_queue[self.BinaryMethod(sorted_queue,queue[0])]
            del queue[0]

            # 入队
            queue.append(nums[i])

            if nums[i]>=sorted_queue[-1]:
                sorted_queue.append(nums[i])
            else:
                sorted_queue.insert(self.BinaryMethod(sorted_queue,nums[i]),nums[i])

            ans_list.append(sorted_queue[-1])
                
        return ans_list

    # 传入lst和target
    def BinaryMethod(self,lst,target):

        # 左右指针
        left_pointer=0
        right_pointer=len(lst)-1
        
        while left_pointer<=right_pointer:

            mid_pointer=floor((left_pointer+right_pointer)/2)

            if lst[mid_pointer]>target:
                right_pointer=mid_pointer-1
            elif lst[mid_pointer]<target:
                left_pointer=mid_pointer+1
            else:
                return mid_pointer

        return left_pointer
        

官方题解:优先队列(堆)

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)

        # 注意 Python 默认的优先队列是小根堆
        q = [(-nums[i], i) for i in range(k)]
        heapq.heapify(q)

        ans = [-q[0][0]]

        for i in range(k, n):
            # 入队
            heapq.heappush(q, (-nums[i], i))

            # 判断是否需要出队:若堆顶元素在滑动窗口内则无需出队
            while q[0][1] <= i - k:
                heapq.heappop(q)

            ans.append(-q[0][0])
        
        return ans

优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素)。

堆(heap)是一种有特殊用途的数据结构,用来在一组变化频繁(发生增删查改的频率较高)的数据集中查找最值

堆在物理层面上,表现为一组连续的数组区间,将整个数组看作是堆。

堆在逻辑结构上,一般被视为是一颗完全二叉树

满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆;反之,则是小堆,或者小根堆,或者最小堆。当一个堆为大堆时,它的每一棵子树都是大堆。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于GeoToolkit/INT实现二维等值线图绘制示例

继续在上一篇文章的基础上&#xff0c;利用相同的数据处理方法统一了地层数据和断层数据格式&#xff0c;本文主要基于GeoToolkit/INT组件&#xff0c;针对地质专业经常用到的地层数据解析和二维等值线&#xff08;等高或等深线&#xff09;可视化需求&#xff0c;本示例实现了…

Sqoop学习笔记

1 简介 Sqoop是Apache下的一款数据传输工具&#xff0c;用于Hadoop和关系型数据库等结构化数据存储之间的数据传输。 最新的稳定版本是1.4.7,Sqoop2 的最新版本是 1.99.7。请注意&#xff0c;1.99.7 与 1.4.7不兼容&#xff0c;且没有特征不完整&#xff0c;也并不打算用于生…

规则引擎入门-基于easy-rules

目录 概念理解实例和编码抽象出2条规则简单的规则引擎事实1的处理事实2的处理 easy-rules 规则的抽象和执行事实描述规则的抽象默认的规则 动态代理执行规则和动作规则的执行&#xff1a;org.jeasy.rules.core.DefaultRulesEngine#doFirepublic class RuleProxy implements Inv…

递归的基本概念

分类&#xff1a; 直接递归 间接递归 如果递归函数中调用递归的语句为最后一个执行语句&#xff0c;则称这种递归为尾递归 递归使用条件 原问题可以划为一个或多个子问题&#xff0c;且子问题的求解方式与原问题相同&#xff0c;只是数量规模不同 递归的调用次…

突破职场难题有效沟通、应对压力、提升能力,实现职场成功

在竞争激烈的职场中&#xff0c;我们经常面临各种职场挑战&#xff0c;例如如何有效沟通、应对工作压力以及提升职业能力等。下面分享一下在职场中的经验&#xff0c;帮助你提升职场技能&#xff0c;实现出色表现&#xff1a; 一、高效沟通&#xff1a; 倾听与理解&#xff1…

5.26~5.27

https://blog.csdn.net/m0_72827793/article/details/130478513 接着之前的内容 32bit.exe为何运行不了&#xff1f; 第一个问题当我运行32bbit.exe 那是因为我编译出的程序时64位的程序 64位程序和32位程序&#xff0c;在编译的时候&#xff0c;具有差异&#xff0c;在32位…

Qt_C++读写M1IC卡源码支持windows国产linux操作系统

Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) IC卡的特性 1、分为16个扇区&#xff0c;每个扇区为4块&#xff0c;每块16个字节,以块为存取单位&#xff1b; 2、每个扇区有独立的一组密码及访问控制&#xff1b; 3、每张卡有唯一序列号…

HACK ME PLEASE: 1实战演练

文章目录 HACK ME PLEASE: 1实战演练一、前期准备1、相关信息 二、信息收集1、访问网站2、端口扫描2、扫描目录3、访问网站4、访问网站5、扫描目录6、访问网站7、登录MySQL数据库8、查看数据表9、查看users表的内容10、查看tblUsers表内容11、解密12、加密13、修改密码14、查询…

CentOS7.6(Linux)环境下有网和无网安装Docker

1、 服务器有网环境 1.1、手动卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine1.2、安装yum-utils sudo yum install -y yum-utils \device-mapper-per…

项目并行管理指南:如何做好多项目管理?

多项目并行已经是大部分企业的现状&#xff0c;多项目并行同时进行已然是大部分企业的现状&#xff0c;同时管理多个项目是一件具有挑战性的&#xff0c;但是有一些方法和工具可以帮助我峨嵋你有条理地实施项目&#xff0c;提高效率&#xff0c;降低工作压力。 一&#xff0c;设…

【C++系列P4】模板搞不懂?脑阔抖三抖!!精讲一篇过!

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过C的老铁&#xff0c;主要内容含 目录 一.模板 1.函数模板 一.函数模板概念 二.函数模板的格式 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的…

多模态应用展望——看图聊天、BLIP2

看图聊天 BLIP2 是 salesforce 公司开源的多模态模型&#xff0c;其大致的原理&#xff0c;可以类比看图写作&#xff0c;当前 AI 在文生图模式之外&#xff0c;也支持图生文模式&#xff0c;可以将照片中的核心元素识别出来。然后把这些元素作为上下文&#xff0c;交给 ChatG…

MYSQL 8 中间字段有NULL 值,还是无法走索引,所以我高估了MYSQL 的查询智商

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

并查集(算法)

目录 一、并查集的概念二、并查集的使用合并集合连通块中点的数量食物链带权并查集扩展域并查集 一、并查集的概念 最裸并查集&#xff1a; 将两个集合合并。 询问两个元素是否在一个集合当中 &#xff0c;近乎 O ( 1 ) O(1) O(1) 时间内支持两个操作 基本原理&#xff1a…

chatgpt赋能python:Python文件大小:如何优化和管理您的文件大小

Python 文件大小&#xff1a;如何优化和管理您的文件大小 Python 是世界上最流行的编程语言之一&#xff0c;被广泛用于各种不同的应用程序。但是&#xff0c;随着项目变得越来越复杂&#xff0c;并且在需要处理大量数据的情况下&#xff0c;文件大小经常成为一个问题。因此&a…

数据包伪造、替换、劫持,https劫持之探索和测试

&#xff08;一&#xff09;数据包替换攻击 该攻击过程如下&#xff1a;伪造服务器响应客户端的数据包。监听客户端的数据包&#xff0c;用预先伪造的数据包&#xff0c;伪装成服务器返回的数据发送给客户端。 因为攻击者跟目标在同一个局域网&#xff0c;所以攻击者发送的数…

算法27:最长公共子序列——样本模型(4)

目录 简介 题目&#xff1a; 思路&#xff1a; 递归版本&#xff1a; 根据递归 分析推导 动态规划版本&#xff1a; 简介 前面刷了几道题目&#xff0c;都是从暴力递归到递归动态规划的版本&#xff0c;最后演变成纯动态规划的版本。接下来的题目&#xff0c;将会跳过 递…

chatgpt赋能python:Python找出列表中出现最多的元素

Python找出列表中出现最多的元素 介绍 在Python的编程过程中&#xff0c;经常需要处理列表&#xff0c;而处理列表时最常见的问题之一就是如何找出列表中出现最多的元素。在某些情况下&#xff0c;我们可能需要确定列表中重复出现最多的元素&#xff0c;并将其提取出来。Pyth…

[机器学习]线性回归

准备入门一下机器学习算法。 今天学习了线性回归&#xff0c;都是理论的东西&#xff0c;没有对于代码的实现&#xff0c;代码也会跟着进度好好搞一下。 对于线性回归的基础概念&#xff0c;我感觉很依靠概率论和线性代数两门课&#xff0c;作为刚准备完数学一考研的我&#xf…

Systrace系列12 —— CPU Info 解读

本文主要是对 Systrace 中的 CPU 信息区域(Kernel)进行简单介绍,简单介绍了如何在 Systrace 中查看 Kernel 模块输出的 CPU 相关的信息,了解 CPU 频率、调度、锁频、锁核相关的信息。 CPU 区域图例 下面是高通骁龙 845 手机 Systrace 对应的 Kernel 中的 CPU Info 区域(底下…