【Hello Algorithm】最大线段重合及加强堆

本篇博客简介:介绍加强堆

加强堆

    • 最大线段重合问题
    • 加强堆

计算时间复杂度的技巧

一般来说 我们在刷算法的时候都要求C/C++语言在1到2s之内完成 java这种语言在2到4秒之内完成

而与之对应的指令条数就是 十的八次方 左右 不会超过一个数量级

所以说根据上面的结论 我们就能够反推题目所需要的时间复杂度

比如说一个数组的大小不超过 十的三次方 我们使用N平方的算法肯定能过

但是如果一个数组的大小不超过 十的六次方 我们就要考虑使用时间复杂度为N 或者是N*LogN的算法了

最大线段重合问题

题目描述如下

每一个线段都有start和end两个数据项,表示这条线段在X轴上从start位置开始到end位置结束。
给定一批线段,求所有重合区域中最多重合了几个线段,首尾相接的线段不算重合。
例如:线段[1,2]和线段[2.3]不重合。
线段[1,3]和线段[2,3]重合

我们下面先讲解题的具体方法 之后再说为什么要这么做

具体方法为:

  1. 我们将所有的线段 按照起始位置从小到大的顺序排序
  2. 我们设置一个小根堆
  3. 从第一个线段开始遍历 首先看线段的起始位置值是多少
  4. 将线段起始位置的值和小根堆里面的数进行比较并弹出所有小于等于该值的数字(没有或空就不弹)
  5. 将第一个线段的结束位置的值加入到小根堆当中
  6. 此时小根堆里面有几个数 就是该线段的答案
  7. 之后重复步骤 3~6
  8. 最后我们会得到一个最大值 该最大值就是我们的答案

下面是解释

我们求的最大值得含义是什么

因为我们再第一步将所有得线段按照起始位置从小到大的顺序排好序了

所以说 起始位置一定是在不断变大得(也有可能不变)

因此 我们只要记录每条线段末尾位置的值并且按照从小到大的顺序排序 就能够计算出以当前线段起点为起始位置的情况下穿过当前线段的线段有多少条

于是我们只要计算出每条线段起始位置穿过线段的最大条数之后比较取最大值就能够得到最后的答案了

为什么只要计算出每条线段起始位置穿过线段的最大条数就能够得出最后的答案

同学们可以在笔记上尝试画出任意条线段 找出它们的重合最多的区域之后观察

我们一定能发现 重合区域的起始位置一定是某条线段的起点

于是乎 我们只要计算出以每条线段为起始位置的重合区域最大值一定能够计算出最后的答案

起始位置相同 终止位置不同的线段排序会影响最终结果吗?

不会影响 因为这些线段的起始位置都相同 所以说不会影响小根堆里面的输出弹出 所以说不会影响到最终结果

题目地址及代码

此题可在牛客网上刷 线段重合

代码如下 起始只要理解了思路 代码并不难写

#include <iostream>
using namespace std;
#include <queue>
#include <vector>
#include <algorithm>
bool Less(const pair<int , int>& kv1 , const pair<int , int>& kv2)
{return kv1.first < kv2.first;
}int main() 
{// num of sectionint count = 0;cin >> count;// receive sectionvector<pair<int , int>> v;int first = 0;int second = 0;while(count--){cin >> first >> second;v.push_back(make_pair(first,second));}sort(v.begin() , v.end() , Less);int max = 0;priority_queue<int , vector<int> , greater<int>> pq;for (auto x: v){while( (!pq.empty()) && pq.top() <= x.first){pq.pop();}pq.push(x.second);max = max > pq.size()? max : pq.size();}cout << max << endl;}

加强堆

我们目前在C++中使用的一个 优先级队列 只是一个简单的堆模型

他给我们暴露出来的接口只能够让我们入堆和出堆 处理不了一些较为复杂的场景

比如说我们将堆中的一个元素值变大或者变小

  • 第一 当前的堆无法支持我们上面说的变大变小操作
  • 第二 修改之后堆无法自动恢复成一个新的堆

要想完成上面我们说的功能 我们的堆就必须要有一个反向索引表

什么是反向索引表

反向索引表是一张哈希表

我们的堆本质上是一个数组 但是我们每次加入一个新的元素之后我们就不能得知该元素的位置在数组的什么下标了

如果我们加上一个哈希表 通过这个哈希表 我们就能直接从这张表中找到元素对应的下标 那么这张哈希表就是我们堆对应的反向索引表

为什么堆不给我们提供反向索引表

因为在实际的引用场景中 我们使用堆并没有要用到反向索引表的场景 而如果我们添加了反向索引表 这实际上是一个非常耗费内存的行为

因此 在给我们使用的标准库中并没有添加反向索引表

如何做

我们前面说了 加强堆和堆之间只差了一个反向索引表

所以说我们只需要将堆的代码复制过来 并且给它的成员加上一个反向索引表

在需要改变下标的地方都修改下反向索引表即可

最后给加强堆加上一个接口 让其可以通过反向索引表修改堆内元素的大小(当然修改完也要记得调整位置)

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

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

相关文章

607. 销售员

import pandas as pddef sales_person(sales_person: pd.DataFrame, company: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:try:# 找到名为 "RED" 的公司的 com_idred_company_id company[company[name] RED][com_id].values[0]# 找到与名为 "RE…

Redis 高可用与集群

Redis 高可用与集群 虽然 Redis 可以实现单机的数据持久化&#xff0c;但无论是 RDB 也好或者 AOF 也好&#xff0c;都解决 不了单点宕机问题&#xff0c;即一旦单台 redis 服务器本身出现系统故障、硬件故障等问题后&#xff0c; 就会直接造成数据的丢失&#xff0c;因此需要…

Unity中的数学基础——贝塞尔曲线

一&#xff1a;前言 一条贝塞尔曲线是由一组定义的控制点P0到 Pn&#xff0c;n1为线性&#xff0c;n2为二次......第一个和最后一个控制点称为起点和终点&#xff0c;中间的控制点一般不会位于曲线上 获取两个点之间的点就是通过线性插值&#xff08; Mathf.Lerp&#xff09…

AR室内导航技术之技术说明与效果展示

随着科技的飞速发展&#xff0c;我们周围的环境正在经历着一场数字化的革命。其中&#xff0c;AR室内导航技术以其独特的魅力&#xff0c;为我们打开了一扇通往全新数字化世界的大门。本文将为您详细介绍这一技术的实现原理、工具应用以及成品展示&#xff0c;带您领略AR室内导…

k8s 安装 kubernetes安装教程 虚拟机安装k8s centos7安装k8s kuberadmin安装k8s k8s工具安装 k8s安装前配置参数

k8s采用master, node1, node2 。三台虚拟机安装的一主两从&#xff0c;机器已提前安装好docker。下面是机器配置&#xff0c;k8s安装过程&#xff0c;以及出现的问题与解决方法 虚拟机全部采用静态ip, master 30机器, node1 31机器, node2 32机器 机器ip 192.168.164.30 # ma…

谷歌浏览器的受欢迎之谜:探析其引人入胜的特点

文章目录 &#x1f340;引言&#x1f340;1. 极速的浏览体验&#x1f340;2. 简洁直观的界面&#x1f340;3. 强大的同步功能&#x1f340;4. 丰富的扩展生态系统&#x1f340;5. 安全与隐私的关注&#x1f340;6. 持续的技术创新&#x1f340;7. 跨平台支持和云整合&#x1f3…

vue中css修改滚动条样式

vue中css修改滚动条样式 效果图&#xff1a; 代码(在app.vue中全局增加下面样式即可)&#xff1a; &::-webkit-scrollbar {width: 8px;height: 8px;border-radius: 3px;}/*定义滚动条轨道 内阴影圆角*/&::-webkit-scrollbar-track {//-webkit-box-shadow: inset 0 0 …

IPD流程中,PDCP评审的内容、评审要素和评审标准

在IPD&#xff08;Integrated Product Development&#xff09;流程中&#xff0c;PDCP&#xff08;Product Design and Critical Process&#xff09;决策评审是一个关键的决策点&#xff0c;用于评估产品设计和关键流程的成果和决策。以下是PDCP决策评审的内容、评审要素和评…

合宙Air724UG LuatOS-Air LVGL API控件--进度条 (Bar)

进度条 (Bar) Bar 是进度条&#xff0c;可以用来显示数值&#xff0c;加载进度。 示例代码 – 创建进度条 bar lvgl.bar_create(lvgl.scr_act(), nil) – 设置尺寸 lvgl.obj_set_size(bar, 200, 20); – 设置位置居中 lvgl.obj_align(bar, NULL, lvgl.ALIGN_CENTER, 0, 0) …

力扣-哈希-最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; **输入&#xff1a;**nums [100,4,200,1,3,2] **输出&a…

bh004- Blazor hybrid / Maui 使用 BootstrapBlazor UI 库快速教程

1. 建立工程 bh004_BootstrapBlazorUI 源码 2. 添加 nuget 包 <PackageReference Include"BootstrapBlazor" Version"7.*" /> <PackageReference Include"BootstrapBlazor.FontAwesome" Version"7.*" />3. 添加样式表文…

Pyecharts教程(一):Python中的pyecharts库绘制3D曲面图

Pyecharts教程(一):Python中的pyecharts库绘制3D曲面图 作者:安静到无声 个人主页 目录 Pyecharts教程(一):Python中的pyecharts库绘制3D曲面图实验结果推荐专栏在Python中,我们可以使用pyecharts库来绘制各种图表,如柱状图、折线图、饼图等。最近,我在学习如何使用pyec…

【Go 基础篇】Go语言获取用户终端输入:实现交互式程序的关键一步

介绍 在许多编程场景中&#xff0c;我们需要编写交互式程序&#xff0c;以便用户可以在终端中输入数据并与程序进行交互。Go语言提供了丰富的方式来获取用户终端输入&#xff0c;使得编写交互式程序变得简单而有趣。本篇博客将深入探讨Go语言中获取用户终端输入的各种方法&…

精准营销的三种打法:社群圈层、人群包、跨屏联动

数据时代的来临&#xff0c;使营销变得有迹可寻&#xff0c;不再只是广撒网&#xff0c;只求愿者上钩&#xff0c;而是更注重精准营销。 若想制定优质的数字营销方案&#xff0c;就要懂得如何与数据打交道&#xff0c;知道抓取哪些数据。众引传播在数据抓取时较为关注两类数据…

adb command

查看屏幕分辨率 adb shell wm size 查看dpi adb shell dumpsys window | grep ‘dpi’ WIFI调试&#xff1a; adb tcpip 5555adb connect 设备ip 注意&#xff0c;USB拔插会断掉&#xff0c;所以插上USB后再 adb connect 设备ip。【注意】华为手机自建热点的ip一般是192.1…

Unity3D Pico VR 手势识别 二

Unity3D Pico VR 手势识别_Cool-浩的博客-CSDN博客 此篇主要讲解怎么手势追踪&#xff0c;手势姿态自定义预制识别&#xff0c;不会导入SDK和配置环境的请看上一章节 环境要求 SDK 版本&#xff1a;2.3.0 及以上PICO 设备型号&#xff1a;PICO Neo3 和 PICO 4 系列PICO 设备系…

【大模型AIGC系列课程 2-2】大语言模型的“第二大脑”

1. 大型语言模型的不足之处 很多人使用OpenAI提供的GPT系列模型时都反馈效果不佳。其中一个主要问题是它无法回答一些简单的问题。 ● 可控性:当我们用中文问AI一些关于事实的问题时,它很容易编造虚假答案。 ● 实时性:而当你询问它最近发生的新闻事件时,它会干脆地告诉你…

unity中Game视图绘制XYZ坐标轴

Game视图显示XYZ坐标轴 功能一&#xff1a;仅显示XYZ坐标轴前期准备设置箭头模型的材质1、在“Assets”中&#xff0c;新建一个名为“Materials”文件夹&#xff0c;专门用于放置材质。选中“Materials”文件夹&#xff0c;鼠标右键->“创建”->“材质”2、重命名为“Red…

聊聊mybatis-plus的sql加载顺序

序 本文主要研究一下如果mybatis mapper定义了多个同名方法会不会有问题 MybatisConfiguration com/baomidou/mybatisplus/core/MybatisConfiguration.java /*** MybatisPlus 加载 SQL 顺序&#xff1a;* <p> 1、加载 XML中的 SQL </p>* <p> 2、加载 SqlP…

【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关

Nginx域名 1.hosts文件 在c:/window/system32/drivers/etc/hosts文件&#xff0c;我们在这个文件中添加 192.168.56.100 msb.mall.com注意如果是没有操作权限&#xff0c;那么点击该文件右击属性&#xff0c;去掉只读属性即可 通过这个域名访问到Nginx服务 2.Nginx的方向代…