(笔试题)区间最大重叠

题目:

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

区间段的数据结构定义如下:

struct Interval{
    int start;
    int end;
};

思路:

首先按照区间的左端点即start对n个区间段进行排序;

然后从前往后遍历所有区间,比较前后两个区间的右端点即end;

假设前后区间分别为[x1,y1],[x2,y2],因为是顺序遍历,因此x2>=x1,考虑一下情况:

如果y2>=y1,

则在[x2,y2]后面的区间和[x1,y1]的重叠部分不会超过这个区间,因为他们的x>x2,而重叠的区间大小为(y1-x+1)或者为0;因此与区间[x1,y1]重叠的大小最大为y1-x2+1或者0。(当x2>y1时,两个区间不相交,即为0)

如果y2<y1,

那么只能说区间[x2,y2]包含在[x1,y1]里面,这样的话,跟区间[x1,y1]重叠的大小至少为y2-x2+1,而区间2的大小即为y2-x2+1,因此可以不考虑其他区间与区间[x2,y2]的重叠大小。

以上两种情况,我们都可以删除一个区间,计算第一种情况后,可以删除区间1,计算第二种情况后,可以删除区间2。

总的时间复杂度为:排序O(nlogn)+遍历O(n)

代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Interval{
    int start;
    int end;
};

bool cmp(const Interval &a,const Interval &b){
    return a.start<b.start;
}

int longestOverlap(vector<Interval> &inters, int n){
    sort(inters.begin(),inters.end(),cmp);
    for(int i=0;i<n;i++){
        cout<<inters[i].start<<" "<<inters[i].end<<endl;
    }
    int maxOverlap=0;
    Interval pre;
    Interval cur;
    pre=inters[0];
    int len;
    for(int i=1;i<n;i++){
        cur=inters[i];
        if(cur.end>=pre.end){
            len=max(pre.end-cur.start+1,0);
            maxOverlap=max(maxOverlap,len);
            pre=cur;
        }
        else
            maxOverlap=max(maxOverlap,cur.end-cur.start+1);
    }
    return maxOverlap;
}

int main()
{
    int n;
    while(1){
        cin>>n;
        vector<Interval> inters(n);
        for(int i=0;i<n;i++){
            cin>>inters[i].start>>inters[i].end;
        }
        cout<<longestOverlap(inters,n)<<endl;
    }

    return 0;
}
时间: 2024-10-10 01:17:45

(笔试题)区间最大重叠的相关文章

笔试题学习(dp,重叠子问题,卡特兰数,手电过桥,最长公共子序列)

卡特兰数:https://blog.csdn.net/doc_sgl/article/details/8880468 dp,重叠子问题:https://www.cnblogs.com/hapjin/p/5572483.html 美团2016校招笔试题:https://zhuanlan.zhihu.com/p/29308843 大厂面试经验:https://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484859&idx=1&s

2015年阿里巴巴校招研发工程师在线笔试题汇总

在线笔试题汇总 卷一: 1.下面的函数中哪个是系统调用而不是库函数______? printf scanf fgetc read print_s scan_s 2.某足球队有四名外援,分别来自巴西.荷兰.意大利和美国.他们分别擅长前锋.后卫或守门,其中: ① 美国外援单独擅长守门: ② 意大利外援不擅长前锋: ③ 巴西外援和另外某个外援擅长相同的位置: ④ 荷兰外援擅长的位置和巴西外援不同. 以上条件可以推出巴西外援擅长的位置是______. 前锋 守门 后卫 前锋或守门 后卫或守门 前锋或后卫

数据挖掘150道笔试题

数据挖掘150道笔试题 单选题 1. 某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A) A. 关联规则发现 B. 聚类 C. 分类 D. 自然语言处理 2. 以下两种描述分别对应哪两种对分类算法的评价标准? (A) (a)警察抓小偷,描述警察抓的人中有多少个是小偷的标准. (b)描述有多少比例的小偷给警察抓了的标准. A. Precision, Recall B. Recall, Precision C. Precision, ROC D. Rec

&lt;转&gt;网易2016实习生前端笔试题部分总结

网易2016实习生前端笔试题部分总结 原文地址:http://www.cnblogs.com/venoral/p/5325202.html 这只是部分题,答案为个人观点如有错误欢迎指出,感觉考点都挺基础,但是很注重考细节方面,通过整理也知道自己在CSS3和HTML5,网络知识等方面的不足还是得多学多练多思考.攒rp,希望自己在明天360笔试中能轻松答过~ css 1.多选 //HTML <p>很长的一段文字,很长的一段文字,很长的一段文字,特别长的文字</p> //CSS p{ w

华为C语言笔试题集合

①华为笔试题搜集 1.static有什么用途?(请至少说明两种)    1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.    2) 在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用函数訪问,但不能被模块外其他函数訪问.它是一个本地的全局变量.    3) 在模块内,一个被声明为静态的函数仅仅可被这一模块内的其他函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么差别?    1) 引用必须被初始化,指针不必.    2)

2015.8.29某高级企业的在线笔试题

收集了今年阿里的在线笔试题,贴出来供需要的朋友参考. 1.下面的函数中哪个是系统调用而不是库函数______?printfscanffgetcreadprint_sscan_s 2.某足球队有四名外援,分别来自巴西.荷兰.意大利和美国.他们分别擅长前锋.后卫或守门,其中:① 美国外援单独擅长守门:② 意大利外援不擅长前锋:③ 巴西外援和另外某个外援擅长相同的位置:④ 荷兰外援擅长的位置和巴西外援不同.以上条件可以推出巴西外援擅长的位置是______.前锋守门后卫前锋或守门后卫或守门前锋或后卫 3

远光软件ASP.NET笔试题小汇总

ASP.NET笔试题是ASP.NET程序员面试必须经历的,一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据库或一些基本的算法(二分查找,递归等),公司一般都是测试你的基本功是否扎实,如果你基本功好就游刃有余不必紧张! 那么下面就是一些ASP.NET笔试题,希望对你的面试准备有帮助. 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:

PHP笔试题总结1

---恢复内容开始--- 1.1    PHP中判断变量的相关函数 1.2    strlen( )与mb_strlen( )的作用分别是什么(新浪网技术部) strlen 和mb_strlen 都是用于获取字符串长度的,其中strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数,如果是多字节编码,如gbk和utf8,使用strlen得到的不是字符串的个数,而是该字符串的总字节数,可以使用mb_strlen获取其字符个数,使用mb_strlen要注意两点,一是要开启mbstring

C/C++ 笔试题

/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问

头条笔试题2018后端第二批

头条笔试题2018后端第二批 标签(空格分隔): 笔试题 描述:为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,