5.在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。

2024-09-03 04:18

本文主要是介绍5.在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这种题目见过一些类似的题目。这里整理一下思路。

一位很牛逼的网友写的,点击打开链接。用的是分治法,类似于归并排序。

还有一种动态规划的方法,点击打开链接,思路如下:

假设S[n]表示n条线段中最长重叠距离,最长重叠距离只与两条线段有关,那么考虑两种情况:

1. 最长重叠距离与第n条线段无关,则最长重叠距离存在于前n-1条线段中,即S[n]=S[n-1];
2. 最长重叠距离与第n条线段有关,则最长重叠距离为第n条线段与前面n-1条线段中的最大重叠距离者,S[n]=max(overlap(segment[n],segment[i])), i=1....n-1

因此得到状态转移方程:

S[n]=0; n<=1
S[2]=overlap(segment[0],segment[1])
S[n]=max(S[n-1],max(overlap(segment[n],segment[i])))

 

这里复习一下动态规划:点击打开链接


代码如下,原版抄的,自己水平真心有限

#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;typedef struct{int start;int end;
}segment;bool isShorter(const segment &s1,const segment &s2);
segment commonSegment(const segment &seg_a,const segment &seg_b);
int findLongestSegment(const vector<segment> &segments,int size,segment &maxSegment);int main()
{int n;int start,end;cout<<" 输入线段个数"<<endl;while(cin>>n){vector<segment>segments(n);for(int i=0;i<n;++i){if(cin>>start && cin>>end){segments[i].start=start;segments[i].end=end;}}sort(segments.begin(),segments.end(),isShorter);segment maxSeg;int maxLen=findLongestSegment(segments,n,maxSeg);cout<<"Longest Length:"<<maxLen<<endl;cout<<"start:"<<maxSeg.start<<endl;cout<<"end:"<<maxSeg.end<<endl;}/*system("pause");*/return 0;
}bool isShorter(const segment &s1,const segment &s2){return s1.end<s2.end;	
}segment commonSegment(const segment &seg_a,const segment &seg_b){segment commonSeg;if(seg_a.end < seg_b.start){commonSeg.start=0;commonSeg.end=0;}else{commonSeg.start=seg_b.start;commonSeg.end=seg_a.end;}return commonSeg;
}int findLongestSegment(const vector<segment> &segments,int size,segment &maxSegment){if(size <= 0)return 0;if(size == 1){maxSegment.start=segments[0].start;maxSegment.end=segments[0].end;return maxSegment.end-maxSegment.start;	}if(size == 2){maxSegment = commonSegment(segments[0],segments[1]);return maxSegment.end-maxSegment.start;}//szie>2 动态规划int maxLen,tempLen;segment tempMaxSeg;maxLen = findLongestSegment(segments,size-1,tempMaxSeg); //递归maxSegment = tempMaxSeg; segment commonSeg;for(int i=0;i<size-1;++i){ //这里记得是size-1,链接中打错了commonSeg=commonSegment(segments[i],segments[size-1]);//只需比较最后一个和前面每一个的公共区间tempLen=commonSeg.end-commonSeg.start;if(tempLen > maxLen){maxLen= tempLen;maxSegment=commonSeg;}}return maxSegment.end-maxSegment.start;
}

这篇关于5.在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132002

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO