堆相关的面试题

news/2024/5/10 12:22:19/文章来源:https://blog.csdn.net/qq_52154068/article/details/129912841

在这里插入图片描述

文章目录

  • 1. 距离不超过k的推排序
  • 2. 最大线段重合问题

1. 距离不超过k的推排序

题目:已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说是比较小的

请选择一个合适的排序策略,对这个数组进行排序

举个例子:
在这里插入图片描述
我们可以看出,每个数到相应的位置后,移动的距离没有超过2。所以在这里,k就是2。那么我们该选择什么方法来排序会比较好呢?

解题思路:
我们知道:k为2,那么什么位置会放在下标0的位置上。下标0,1,2都有可能移到这个位置。那么我们可以先创建大小为k+1的小根堆。

我们将前3个数插入堆中,这样堆顶为这三个数最小的数,放到0位置。然后删除堆顶元素,再把下标为3的数插入堆中,这样堆顶的元素就该放在1的位置。再删除堆顶,再把下标为4的数人堆,这样堆顶的元素就在2的位置上,依次类推。

当最后的数入堆后,把堆里面的数一个一个弹出,放在数组后面,就完成了排序。这个方法的时间复杂度是:O(N*logK),如果k比较小的话,就是O(N)

代码实现:
在这里插入图片描述

2. 最大线段重合问题

题目:给定很多线段,每个线段都有两个数[start,end],表示线段开始位置和结束位置,左右都是闭区间,且是整数。规定:线段重合区域的长度必须>=1。返回线段最多重合区域中,包含了几条线段

什么叫做线段重合区域的长度必须>=1

举个例子:
[1,3]和[3,6],它们的情况如下图:
在这里插入图片描述
这种情况是不满足的。

解题流程:
第一步:将每个线段按照开始位置进行一个从小到大的排序
在这里插入图片描述
在这里插入图片描述
第二步:创建一个小根堆,然后将小于等于线段开始的位置的数弹出,弹出完结束之后,把线段结尾的数入堆。
首先,[1,7]我们要把小于等于1的数从堆里弹出,因为一开始堆里面什么都没有,所以什么事都不干。然后把7入堆。此时,堆里面的个数就是此线段重合的个数。也就是说[1,7]重合数是1。

[2,3]我们要把小于等于2的数从堆里面弹出,然后将3入堆。此时堆里面个数为2,[2,3]重合个数也就是2。

[4,5]我们要把小于等于4的数从堆里面弹出,然后将5入堆。此时堆里面个数为2,[4,5]重合个数也就是2。

[4,6]我们要把小于等于4的数从堆里面弹出,然后将6入堆。此时堆里面个数为3,[4,6]重合个数也就是3。

那么这个线段的最多重合个数就为3。

那么为什么这样就能得出最大线段重合数呢
我们知道:一个重合的线段,重合线段的左边界,一定是某一个线段的左边界。所以,我们在遍历每个线段的时候,我们都认为这个线段的左边界为重合的左边界。那么我们就看有多少个数穿过这个左边界。
在这里插入图片描述
假设,我们遇到了[10,17]这个区间的线段,小根堆里面的8和9说明是前面线段的结尾,这些结尾都没超过10,说明这些线段根本不可能穿过10。

在这里我们要注意:只要开始顺序相同的线段,它们之间排序的顺序没有要求,因为不论是谁先,弹出的都是小于等于开始位置。结尾的数也都会入堆

代码实现:
在这里插入图片描述
这个算法,我们需要把每个线段都遍历一遍,所以是N。每次插入和删除小根堆最坏情况下是logN。所以时间复杂度是O(N*logN)。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WinRAR压缩解压文件

使用WinRAR压缩管理器压缩解压文件详细步骤如下: ■ 压缩文件 ① 鼠标右键需要压缩的文件,点击“添加到压缩文件”,具体操作步骤如图所示: ② 压缩后的对应文件压缩包会显示在桌面,如图所示: ■ 解压文件 …

如何设计一个高并发系统

目录 如何理解高并发系统 1. 分而治之,横向扩展 2. 微服务拆分(系统拆分) 3. 分库分表 4. 池化技术 5. 主从分离 6. 使用缓存 7. CDN——加速静态资源访问 8. 消息队列——削锋 9. ElasticSearch 10. 降级熔断 11. 限流 12. 异步…

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务准备工作 需要安装好nodejs,nodejs下载地址,下载对应的版本向导式安装即可。 安装完成后,控制台输入node -v&a…

【CentOS 7安装MySQL 8的教程指南】

CentOS 7安装MySQL 8 添加MySQL官方源 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm安装MySQL 8 sudo yum install mysql-community-server安装失败执行下面的命令并再次执行安装…

进程与线程的区别和联系

进程与线程的区别和联系🔎进程🔎线程🔎进程与线程的联系🔎进程与线程的区别🔎总结🔎 结尾🔎进程 进程简单来说就是运行着的程序 如果不太理解可以参考一下这篇文章 进程 🔎线程 …

【MySQL--01】数据库基础

文章目录1.什么是数据库2.主流数据库2.1 MySQLMySQL架构实例3.基本使用3.1 MySQL的安装3.2 连接服务器3.3服务器管理4.服务器,数据库,表之间的关系5.使用数据库6.SQL分类7.存储引擎查看存储引擎存储引擎对比1.什么是数据库 数据库是用来存储数据的。那么…

Java BigDecimal学习

文章目录Java BigDecimal不损失精度的方法Java BigDecimal的几种舍入模式1、UP(BigDecimal.ROUND_UP)2、DOWN(BigDecimal.ROUND_DOWN)3、CEILING(BigDecimal.ROUND_CEILING)4、FLOOR(BigDecimal.ROUND_FLOOR)5、HALF_UP(BigDecimal.ROUND_HALF_UP)6、HALF_DOWN(BigDecimal.ROUN…

QMake宏定义常量和字符串或带空格的字符串(在代码中使用)

答案 宏定义常量 DEFINES EXPIR_TIME123宏定义字符串(不带空格) DEFINES NIHAO\\\"nihao\\\"宏定义字符串(带空格也适用于不带空格的情况) 推荐 DEFINES NIHAO\"\\\"ni" "hao\\\"\"QMAKE宏定义常量 环境: visual studio 2018 …

Java基础之List

文章目录一、List介绍二、List常用方法 List应知应会2.1 调用add()方法增添数据(可指定位置添加)2.2 调用remove()方法删除指定位置元素并返回被删除元素2.3 调用set()方法修改指定位置元素并返回初始数据2.4 调用get()方法返回指定位置元素三、List可重…

SQL注入写入文件方法(获取webshell)

数据库写入文件条件 1、当前数据库用户为 root 权限2、知道当前网站的绝对路径3、secure_file_priv 的参数必须为空或目录地址4、PHP的 GPC 为 off状态;(魔术引号,GET,POST,Cookie)用 sqli-labs 测试查看当前用户权限Python sqlma…

本机连接Vmware虚拟机中win7的SQLServer数据库

在开发中,可能遇到不同数据库或不同版本的问题,为了避免在本机安装卸载造成后续无法再次安装的情况,我们在虚拟机中安装需要的版本进行测试。 本篇介绍如何在本机连接到虚拟机中的数据库。 解决流程如下: 一:进入虚…

学Vue3这一篇就够了!

目录学习Vue的前提是掌握 HTML,CSS,Js中级知识vue介绍声明式渲染条件与循环处理用户输入组件化应用构建Vue与自定义元素的关系应用和组件实例Vue实例根组件组件实例 property生命周期钩子实例的生命周期图模板语法插值文本原始 HTMLAttribute使用 JavaScript 表达式指令参数动态…

Linux驱动开发——字符设备

目录 Linux设备分类 字符设备驱动基础 字符设备驱动框架 虚拟串口设备 Linux设备分类 Linux系统根据驱动程序实现的模型框架将设备驱动分为下面三种。 (1)字符设备驱动:设备对数据的处理是按照字节流的形式进行的,可以支持随机访问,也可以不支持随…

抽象类,接口

抽象类:当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。 package com.hspedu.abstract_;public class Abstract01 {public static void main(String[] args) {} } a…

Linux 操作系统原理 — PCIe 总线标准

目录 文章目录目录总线系统PCIe 总线PCIe 总线的传输速率PCIe 总线的架构PCIe 外设PCIe 设备的枚举过程PCIe 设备的编址方式BDF(Bus-Device-Function)编号BAR(Base Address Register)地址Linux 上的 PCIe 设备查看 PCIe 设备的 BD…

算法强化--两数之和

hi,大家好,今天为大家带来一道题目,求两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一…

Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码

原文:http://inventwithpython.com/beyond/chapter3.html 代码格式化是将一组规则应用于源代码,从而使得代码风格能够简洁统一。虽然代码格式对解析程序的计算机来说不重要,但代码格式对于可读性是至关重要的,这是维护代码所必需的…

【剑指offer|4.从尾到头打印单链表】

0.从尾到头打印单链表 单链表:一般给的都是无头节点的 另外:在面试中,如果我们打算修改输入的数据,则最好问一下面试官是不是允许修改 下面这种先把链表节点的值按链表序放到数组中,然后来一个算法库中的reverse属实有…

一文懂KL散度KL Divergence

本文翻译自https://naokishibuya.medium.com/demystifying-kl-divergence-7ebe4317ee68 KL散度中的KL全称是Kullback-Leibler,分别表示Solomon Kullback和Richard A.Leibler这两个人。 一、KL散度的定义 KL散度表明概率分布Q和概率分布P之间的相似性,由…

ARM Linux 内核启动1 —— 汇编阶段

一、Makefile分析 1、Makefile 分析 (1) kernel 的 Makefile 写法和规则等,和 uboot 的 Makefile 是一样的,甚至 Makefile 中的很多内容都是一样的。 (2) kernel 的 Makefile 比 uboot 的 Makefile 要复杂,这里我们并不会一行一行的详细分析…