每日一题——寻找右区间(排序 + 二分查找)

news2024/11/24 13:46:18

寻找右区间(排序 + 二分查找)

题目链接

在这里插入图片描述


理解题目

  • 题目给定一个具有n行2列的二维数组intervals,对于intervals每一行元素i,就表示一个区间数组intervals[i][0]即这个区间数组的起始位置startintervals[i][1]就是区间数组的结束位置end。同时,题目告诉我们对于每一个区间数组i,他们的start都不同

  • 题目要我们找的,就是对于每一个区间数组i,寻找一个start满足start >= end,如果存在该start,就要使start最小化,即使start - end的值最小

  • 找到start后,就将这个start的索引记录到返回数组(如果这个start位于第n个区间数组,那么索引就是n - 1),否则记录-1

思路

最简单的思想,就是利用两层循环来求得答案。第一层循环用来遍历每个区间数组intervers[i],第二层循环用来找到每一个intervals[i][start]end,但显然,这个方法的时间复杂度为O(N2),效率低,故不做讨论

应该想到,我们应该对每个区间数组进行排序,以此来优化我们的查找。

需要解决以下几个问题:

  1. 我们应该以每个区间的start为标准还是以end为标准进行排序?
  • 要清楚的一点是,本题我们查找的是符合条件的start,以此来满足start >= intervals[i][start],因此,如果要优化查找start的效率,就应该以start为标准对每个区间数组进行排序
  1. 找到符合条件的start后,要将其所在区间数组的索引记录在返回数组,但是将区间数组排序后,索引值不久变了吗?怎么解决?
  • 我们可以新建一个结构体数组StartNode用来存储每个区间数组的start以及索引index,这样就不会丢失正确定索引了。
typedef struct Node
{
    int start;	//区间数组的start
    int index;	//区间数组的索引
}Node;

int cmp(const void* num1, const void* num2)
{
    return ((Node*)num1)->start - ((Node*)num2)->start;
}

int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize){
    //创建一个结构体数组
    //用来存储每个区间数组的start,及其索引
    Node* StartNode = (Node*)malloc(sizeof(Node) * intervalsSize);
    for (int i = 0; i < intervalsSize; i++)
    {
        StartNode[i].start = intervals[i][0];
        StartNode[i].index = i;
    }

    //对区间数组的start进行升序排序
    qsort(StartNode, intervalsSize, sizeof(Node), cmp);
    
    ………………
}

解决了这两个问题,就可以开始正式查找了:

利用一层循环遍历每个区间数组的end,接着利用二分查找在StartNode中查找符合条件的start,同时将索引录入返回数组,如果没有找到,就录入-1。

实现代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
typedef struct Node
{
    int start;
    int index;
}Node;

int cmp(const void* num1, const void* num2)
{
    return ((Node*)num1)->start - ((Node*)num2)->start;
}

int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize){
    int row = intervalsSize;
    int col = *intervalsColSize;

    //创建一个结构体数组
    //用来存储每个区间数组的start,及其索引
    Node* StartNode = (Node*)malloc(sizeof(Node) * intervalsSize);
    for (int i = 0; i < intervalsSize; i++)
    {
        StartNode[i].start = intervals[i][0];
        StartNode[i].index = i;
    }

    //对区间数组的start进行升序排序
    qsort(StartNode, intervalsSize, sizeof(Node), cmp);

    int* ret = (int*)malloc(sizeof(int) * intervalsSize);
    *returnSize = intervalsSize;

    //遍历原数组的每一个end
    //同时在已经有序的升序数组中找到第一个大于end的start
    //并将其索引记录到返回数组,如果找不到,就记录为-1
    for (int i = 0; i < intervalsSize; i++)
    {
        int end_i = intervals[i][1];
        int target = -1;	//target即正确的索引位置,初始化为-1代表假定找不到符合条件的start
	
        //利用二分法找到 start >= end,同时又是最小的start及其索引
        int left = 0;
        int right = intervalsSize - 1;
        while (left <= right)
        {
            int mid = (right - left) / 2 + left;

            if (StartNode[mid].start >= end_i)
            {
                target = StartNode[mid].index;
                right = mid - 1;
            }
            else
                left = mid + 1;
        }
		
        //将索引录入返回数组
        ret[i] = target;
    }
	
    //销毁申请的动态内存
    free(StartNode);

    return ret;
}

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

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

相关文章

JTS:09Touches 接触

这里写目录标题 版本JTS Touches边接触角点接触内部接触线段交叉顶点接触 版本 org.locationtech.jts:jts-core:1.19.0 链接: github JTS Touches 边接触 public void test00() {Coordinate[] coordinates1 new Coordinate[] {new Coordinate(1, 1), new Coordinate(1, 4),…

Gronwall‘s inequality

本文的主要了解下Gronwall不等式的两种形式&#xff0c;此不等式常常用来证明函数有界。 See 知乎&#xff1a; https://zhuanlan.zhihu.com/p/339358108

Vue底层术语解析以及存在关系

Vue底层术语解析以及存在关系 虚拟 DOM渲染函数Vue2Vue3 diff 算法抽象语法树&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;关系 虚拟 DOM 可能都听说过虚拟dom &#xff0c;虚拟dom到底是Vue的啥&#xff0c;再此针对性讲解&#xff08;针对Vue官网简单化理解…

新手十分钟也能完成的Unity小游戏打砖块

由Siki学院打砖块游戏启发完成一个非常非常简单&#xff0c;纯新手也能十分钟做出来的小游戏——打砖块。 一.搭建场景 首先我们先在一个空白的3D项目中创建一个Plane平面&#xff0c;将其放置于世界中央位置&#xff0c;长宽设置为2&#xff0c;并为其添加一个材质Material&am…

掌握Go的运行时:从编译到执行

目录 一、Go运行编译简介Go语言的目标和设计哲学运行时环境编译过程小结 二、执行环境操作系统与硬件层系统调用&#xff08;Syscalls&#xff09;虚拟内存 Go运行时&#xff08;Runtime&#xff09;Goroutine调度器内存管理和垃圾收集网络I/O代码示例&#xff1a;Go运行时调度…

SQL:增、删、改、查 基本语句 Navicat建库(用法 + 例子)

文章目录 新建数据库新建表 增、删、改、查select 查找insert 添加delete 删除update 修改where 扩展 < > < > ! <> 比较运算符and or 逻辑运算符between...and... 介于..和..之间in 包含like 模糊查询is null 为空的 查询扩展order by 排序limit start coun…

7.网络原理之TCP_IP(下)

文章目录 4.传输层重点协议4.1TCP协议4.1.1TCP协议段格式4.1.2TCP原理4.1.2.1确认应答机制 ACK&#xff08;安全机制&#xff09;4.1.2.2超时重传机制&#xff08;安全机制&#xff09;4.1.2.3连接管理机制&#xff08;安全机制&#xff09;4.1.2.4滑动窗口&#xff08;效率机制…

朴素贝叶斯深度解码:从原理到深度学习应用

目录 一、简介贝叶斯定理的历史和重要性定义例子 朴素贝叶斯分类器的应用场景定义例子常见应用场景 二、贝叶斯定理基础条件概率定义例子 贝叶斯公式定义例子 三、朴素贝叶斯算法原理基本构成定义例子 分类过程定义例子 不同变体定义例子 四、朴素贝叶斯的种类高斯朴素贝叶斯&a…

LM小型可编程控制器软件(基于CoDeSys)笔记三十一:保持变量和非保持变量

所谓变量&#xff0c;就是用字母、数字和下划线组成的一个标识符。 按照数据类型的不同&#xff0c;变量可以分为标准类型和用户自定义类型。其中标准类型包括布尔型 &#xff08; BOOL &#xff09;、整型&#xff08; INT &#xff09;、实型&#xff08; REAL &#xff09…

【网络协议】TCP报文格式

1.源端口和目的端口 源端口字段占16比特&#xff0c;用来写入源端口号。源端口号用来标识发送该TCP报文段的应用进程。 目的端口字段占16比特&#xff0c;用来写入目的端口号。目的端口号用来标识接收该TCP报文段的应用进程。 2.序号 当序号增加到最后一个时&#xff0c;下…

【C语言_题库】舍罕网的失算?明明是我的失算!

test 舍罕王 失算 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜爱象棋&#xff0c;决定让宰相自己选择何种赏赐。这位聪明的宰相指着 8 * 8 共 64 格的象棋说&#xff1a;“陛下&#xff0c;请您赏给我一些麦子吧。就在棋盘的第 1 格放 1 粒&#xff0c;第 2…

leetCode 198.打家劫舍 动态规划

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#…

机器学习---BP算法

1. 多级网络 层号确定层的高低&#xff1a;层号较小者&#xff0c;层次较低&#xff0c;层号较大者&#xff0c;层次较高。 输入层&#xff1a;被记作第0层。该层负责接收来自网络外部的信息。 第j层&#xff1a;第j-1层的直接后继层&#xff08;j>0&#xff09;&#xff…

sub0 里斯本精彩回顾:探索波卡区块的创新空间

sub0 Europe 2023 已在葡萄牙里斯本圆满结束&#xff01;sub0 大会是波卡生态开发者大会&#xff0c;由波卡协议的主要开发方 Parity Technologies 举办的开发者大会&#xff0c;汇聚了全球 Substrate 开发者和学习者&#xff0c;旨在为 Polkadot 和 Kusama 生态的开发者、贡献…

【红日靶场】vulnstack2-完整渗透过程

文章目录 一、网络拓扑二、描述配置环境渗透开始信息收集开始攻击干掉杀软cs上线权限提升 内网探测横向移动再次横向rdp连接痕迹清除 总结&#xff1a; 一、网络拓扑 网络配置&#xff1a; 二、描述 红队实战系列&#xff0c;主要以真实企业环境为实例搭建一系列靶场&#x…

Library ‘iconv2.4.0‘ not found 问题及解决方法

今天升级了一下Mac mini 和Xcode&#xff0c;运行项目就报Library iconv2.4.0 not found的错误 mac mini 升级&#xff1a;13.0 --> 13.6 xcode升级到&#xff1a;15.0(15A240d) 可以肯定 项目在旧版本下&#xff0c;是能通过编译 并且能运行的。 废话不多说&#xff0c…

网络安全——自学(黑客)方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

再生之术:遗忘 Root 密码的 CentOS8 Stream 解决方案

文章目录 大魔头 RootGRUB 引导界面BootLoaderGRUB主要功能选择启动的操作系统编辑内核启动参数 进入GRUB 引导界面编辑内核启动参数单用户模式 进入内核编辑界面rd.break进入单用户模式 大魔头 Root 哈哈&#xff0c;你好&#xff01;今天&#xff0c;让我们来聊聊 Linux 系统…

提高效率!掌握项目管理工具中任务优先级的使用技巧

在项目管理中&#xff0c;我们经常会遇到一些具有强制依赖关系的任务。这些任务之间的关系是绝对的&#xff0c;并且毫无疑问必须首先完成什么。例如&#xff0c;您必须先设计一个产品&#xff0c;然后才能构建它&#xff0c;并且必须先构建它&#xff0c;然后才能绘制它。然而…

嵌入式芯片-NE555

目录 1、比较器&#xff08;运放&#xff09; 2、相反门&#xff08;非门&#xff09; 3、或非门 4、双稳态触发器 5、NE555功能框图 1、比较器&#xff08;运放&#xff09; 2、相反门&#xff08;非门&#xff09; 3、或非门 4、双稳态触发器 5、NE555功能框图