30. 区间交集

news2025/1/3 8:27:29

题目描述

给定一组闭区间,其中部分区间存在交集。

任意两个给定区间的交集,称为公共区间(如:[1,2],[2,3]的公共区间为[2,2],[3,5],[3,6]的公共区间为[3,5])公共区间之间若存在交集,则需要合并(如:[1,3],[3,5]区间存在交集[3,3],需合并为[1,5])。按升序排列输出合并后的区间列表

输入描述

组区间列表

区间数为 N: O<=N<=1000。

区间元素为 X:-10000<=X<=10000。

输出描述

升序排列的合并区间列表

备注

1、区间元素均为数字,不考虑字母、符号等异常输入。

2、单个区间认定为无公共区间。

用例

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.给定一组闭区间,其中部分区间存在交集。

2.任意两个给定区间的交集,称为公共区间。

3.公共区间之间若存在交集,则需要合并,按升序排列输出合并后的区间列表

4.输入描述:组区间列表区间数为N,大于等于0小于等于1000.

区间元素为X,大于等于-10000小于等于10000

5.输入描述:升序排列的合并区间列表

6.备注:(1)区间元素均为数字,不考虑字母、符号等异常输入

(2)单个区间认为无公共区间。

二、解题思路

1.首先我们读取数据int N;区间数

scanf("%d", &N);

2.之后开始读取区间元素

int X[N][2];

for(int i = 0; i < N; i++) {

scanf("%d %d", &X[i][0], &X[i][1]);

}

3.然后我们计算公共区间

int Y[N * N][2];

int idx = 0;

for(int i = 0; i < N; i++) {

for(int j = i + 1; j < N; j++) {

// 如果比较小的值大于下一个区间比较大的值的时候没有交集

// 如果比较大的值小于下一个区间比较小的值的时候没有交集

// 比较小或者比较大的值有一个在下一个区间内的时候有交集

// 如果比较小的值大于下一个区间比较小的值但是小于下一个区间比较大的值

// 证明至少有一个数相交,公共区间从X[i][0]开始

// 比如第一个区间是1 3 第二个区间是0 4,1比0大比4小,3比4小,所以整个第一个区间都是贡藕给你区间

if(X[i][0] >= X[j][0] && X[i][0] <= X[j][1]) {

// 如果前一个区间的比较大的值小于等于后一个区间比较大的值,那么整个前一个区间都是公共区间

if(X[i][1] <= X[j][1]) {

Y[idx][0] = X[i][0];

Y[idx++][1] = X[i][1];

//如果前一个区间比较大的值大于后一个区间比较大的值,那么它们的公共区间是从前一个数字比较小的值到后一个数字比较大的值

else {

Y[idx][0] = X[i][0];

Y[idx++][1] = X[j][1];

}

}

// 比如第一个区间是1 3 第二个区间是2 4,此时已经证明1不在2,4之间,

// 且3在2,4之间,那么我们的交集就是2,3

else if(X[i][1] >= X[j][0] && X[i][1] <= X[j][1]) {

Y[idx][0] = X[j][0];

Y[idx++][1] = X[i][1];

}

else if(X[j][0] >= X[i][0] && X[j][0] <= X[i][1]) {

if(X[j][1] <= X[i][1]) {

Y[idx][0] = X[j][0];

Y[idx++][1] = X[j][1];

else {

Y[idx][0] = X[j][0];

Y[idx++][1] = X[i][1];

}

}

else if(X[j][1] >= X[i][0] && X[j][1] <= X[i][1]) {

Y[idx][0] = X[i][0];

Y[idx++][1] = X[j][1];

}

}

}

4.然后我们要合并公共区间,首先我们对公共空间进行一个排序

qsort(Y, idx, sizeof(Y[0]), compare);

int Z[idx][2];

int idxz = 0;

for(int i = 0; i < idx; i++) {

Z[idxz][0] = Y[i][0];

while(i < idx && Y[i][1] >= Y[i + 1][0]) {

i++;

}

i--;

Z[idxz++][1] = Y[i][1];

}

5.输出结果

if(idx == 0) printf("None\n");

else {

for(int i = 0; i < idxz; i++) {

printf("%d %d\n", Z[i][0], Z[i][1]);

}

}

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 比较函数,用于qsort按照区间起始值从小到大排序
int compare(const void* a, const void* b) {
    int (*arr_a)[2] = (int (*)[2])a;
    int (*arr_b)[2] = (int (*)[2])b;
    int result = (*arr_a)[0] - (*arr_b)[0];
    if(result == 0) {
        return ((*arr_a)[1] - (*arr_b[1]));
    }
    return result;
}

int main() {
    int N;
    scanf("%d", &N);
    // 动态分配内存用于存储区间数据
    int** X = (int**)malloc(N * sizeof(int*));
    for (int i = 0; i < N; i++) {
        X[i] = (int*)malloc(2 * sizeof(int));
    }

    // 读取区间元素
    for (int i = 0; i < N; i++) {
        scanf("%d %d", &X[i][0], &X[i][1]);
    }

    // 计算公共区间,使用动态分配内存的数组来存储
    int** Y = (int**)malloc(N * N * sizeof(int*));
    for (int i = 0; i < N * N; i++) {
        Y[i] = (int*)malloc(2 * sizeof(int));
    }
    int idx = 0;
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            // 简化的区间相交判断逻辑,先确定两个区间的最小值和最大值
            int min_start = (X[i][0] < X[j][0]) ? X[i][0] : X[j][0];
            int max_start = (X[i][0] > X[j][0]) ? X[i][0] : X[j][0];
            int min_end = (X[i][1] < X[j][1]) ? X[i][1] : X[j][1];
            int max_end = (X[i][1] > X[j][1]) ? X[i][1] : X[j][1];

            if (max_start <= min_end) {
                // 存在交集,计算公共区间并存入Y数组
                Y[idx][0] = max_start;
                Y[idx][1] = min_end;
                idx++;
            }
        }
    }

    // 对公共区间数组Y进行排序
    qsort(Y, idx, sizeof(Y[0]), compare);

    // 合并公共区间,使用动态分配内存的数组来存储合并后的区间
    int** Z = (int**)malloc(idx * sizeof(int*));
    for (int i = 0; i < idx; i++) {
        Z[i] = (int*)malloc(2 * sizeof(int));
    }
    int idxz = 0;
    for (int i = 0; i < idx; ) {
        Z[idxz][0] = Y[i][0];
        int end = Y[i][1];
        int j = i + 1;
        while (j < idx && Y[j][0] <= end) {
            if (Y[j][1] > end) {
                end = Y[j][1];
            }
            j++;
        }
        Z[idxz][1] = end;
        idxz++;
        i = j;
    }

    // 输出结果
    if (idx == 0) {
        printf("None\n");
    } else {
        for (int i = 0; i < idxz; i++) {
            printf("%d %d\n", Z[i][0], Z[i][1]);
        }
    }

    // 释放动态分配的内存
    for (int i = 0; i < N; i++) {
        free(X[i]);
    }
    free(X);
    for (int i = 0; i < N * N; i++) {
        free(Y[i]);
    }
    free(Y);
    for (int i = 0; i < idx; i++) {
        free(Z[i]);
    }
    free(Z);

    return 0;
}

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

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

相关文章

redis cluster实验详解

华子目录 实验环境准备部署redis cluster添加节点删除节点redis cluster集群维护 实验 环境准备 再开3台主机 先把之前3台源码编译的redis删除 [rootredis-node1 ~]# cd /usr/local/redis/ [rootredis-node1 redis]# make uninstall[rootredis-node2 ~]# cd /usr/local/redi…

微服务-服务保护和分布式事务

假如微服务中某个服务出现了故障,那我们需要为这个服务做好一些兜底的方案,健壮性的处理,这就是服务保护.以前我们写的是单体项目,不论项目多复杂,操作多少张表,最终都能够满足事务ACID的特性,但是我们分成了很多个服务之后,由于很多的服务是独立的,有各自的数据库,破坏了事务A…

【已解决】PDF文档有密码怎么办(2024新)免费在线工具PDF2Go

强大的解密工具PDF2Go使用指南 一、PDF2Go简介 PDF2Go是由德国QaamGo公司开发的在线PDF工具箱&#xff0c;以其强大的功能和用户友好的界面而闻名。它不仅免费&#xff0c;而且不需要用户注册或安装任何软件&#xff0c;只需打开浏览器即可使用。 二、功能特点 1. 免费且无需…

Ashy的考研游记

文章目录 摘要12.1112.2012.21 DAY1&#xff08;政治/英语&#xff09;政治英语 12.22 DAY2&#xff08;数学/专业课&#xff09;数学专业课 结束估分 摘要 在24年的12月里&#xff0c;Ashy完成了他的考研冲刺&#xff0c;顺利的结束了他本年度的考研之旅。 在十二月里&#…

Flutter-插件 scroll-to-index 实现 listView 滚动到指定索引位置

scroll-to-index 简介 scroll_to_index 是一个 Flutter 插件&#xff0c;用于通过索引滚动到 ListView 中的某个特定项。这个库对复杂滚动需求&#xff08;如动态高度的列表项&#xff09;非常实用&#xff0c;因为它会自动计算需要滚动的目标位置。 使用 安装插件 flutte…

XIAO Esp32 S3 轻松发送 HTTP 请求,打造智能物联网应用

让物联网更智能,连接更便捷! ESP32 是一款高性能的物联网开发平台,它不仅支持 Wi-Fi 和蓝牙,还是实现各种智能设备连接和控制的理想选择。今天,我们为你展示如何利用 ESP32 发送 HTTP 请求,轻松实现设备间的数据传输和远程控制。 为什么选择 ESP32 发送 HTTP 请求? 强大…

Unity中实现转盘抽奖效果(一)

实现思路&#xff1a; 旋转转盘的z轴&#xff0c;开始以角加速度加速到角速度最大值&#xff0c;结束的时候&#xff0c;以角加速度减速使角速度减少到0&#xff0c;然后转盘z轴旋转的角度就是加上每秒以角速度数值大小&#xff0c;为了使角度不能一直增大&#xff0c;对360度…

Postman[8] 断言

1.常见的断言类型 status code: code is 200 //检查返回的状态码是否为200 Response body&#xff1a; contain string //检查响应中包含指定字符串包含指定的值 response body:json value check/ /检查响应中其中json的值 Response body&#xff1a; is equal to string …

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站&#xff1a;https://www.jetbrains.com/pycharm/。下载社区版&#xff08;免费&#xff09;或专业版&#xff08;收费&#xff0c;提供更多功能&#xff09;。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm&#xff0c;并根…

记录一下图像处理的基础知识

记录一下自己学习的图像处理的基础知识。 一、图像的文件格式以及常用的图像空间 1、文件格式 常见的图像文件格式有 jpg, png, bmp, gif &#xff08;1&#xff09;jpg&#xff1a;有损压缩算法&#xff0c;大幅减小文件大小&#xff0c;便于存储和传输&#xff0c;兼容性…

0030.停车场车位预约管理系统+论文

一、系统说明 基于springbootvueelementui开发的停车场车位预约管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 二、系统架构 前端&#xff1a;vue| elementui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql8.0 | maven 三、代…

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)

上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…

Postman[4] 环境设置

作用&#xff1a;不同的环境可以定义不同的参数&#xff0c;在运行请求时可以根据自己的需求选择需要的环境 1.创建Environment 步骤&#xff1a; Environment-> ->命名->添加环境变量 2.使用Environment 步骤&#xff1a;Collection- >右上角选择需要的环境

【PCIe 总线及设备入门学习专栏 4.5 -- PCIe Message and PCIe MSI】

文章目录 PCIe Message 与 MSIPCIe Message 和 MSI 的作用与关系MSI 的配置与寄存器MSI 和 ARM GIC 的关系示例&#xff1a;MSI 在 ARM GIC 的实际应用总结 PCIe Message 与 MSI 本文将介绍 PCIe message 的作用以及message 与 MSI 的关系&#xff0c;再介绍 MSI 如何配置以及…

jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例

目录 前言 一、关于Jquery Validate组件 1、validate是什么 2、内置验证方式及触发方式 3、自定义验证规则 二、基本验证实战以及Remote验证 1、基本验证实现 2、remote校验方式 三、总结 前言 随着技术的不断演进&#xff0c;在我们的日常开发过程中&#xff0c;大家一…

连锁餐饮行业数据可视化分析方案

引言 随着连锁餐饮行业的迅速发展&#xff0c;市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势&#xff0c;以制定科学合理的决策&#xff0c;提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据&#xff0c;通过直观、动态的可…

WPF 样式

WPF 有自己的样式设置系统&#xff0c;也自带类似 Winform 的默认样式。默认样式比较一般&#xff0c;我们可以使用下面几种方式自定义好看的 wpf 样式。 1. 本地直接设置 比如更改按钮的背景色和字体颜色&#xff0c; <Grid><StackPanel Orientation"Horizon…

RabbitMQ实现生产者消费者

一.启动MQ 注意管理员身份进入cmd才行,我这里是在本地安装的MQ,推荐使用虚拟机安装 二.思路 官方解释RabbitMQ结构: 自我理解RabbitMQ结构: 其实RabbitMQ的服务器就像邮局一样,我们的生产者和消费者对于这个服务器来说都是消费者,因为服务器都可以向两者发送消息 环境准备 …

虚拟机用网线连其他设备(ROS多机网络配置)

电脑配置 把局域网的网线插入电脑&#xff0c;点击这边 配置以太网的IP 比如说我ROS主机的IP想设为192.168.144.10&#xff0c;那我笔记本的以太网IP可以设为192.168.144.8。 假设还有另外一个电脑&#xff08;ROS从机&#xff09;&#xff0c;他的IP被设置未192.168.144.4…

VIM: Vision Mamba基于双向状态空间模型的高效视觉表示学习

这篇文章的主要内容可以概括如下&#xff1a; 背景与动机&#xff1a; 近年来&#xff0c;状态空间模型&#xff08;SSM&#xff09;在长序列建模中展现出巨大潜力&#xff0c;尤其是Mamba模型在硬件感知设计上的高效性。 然而&#xff0c;现有的SSM模型在处理视觉数据时面临…