最大重叠区间的个数

只要将区间分隔成各个点,每个点有两个属性,一个是值,一个是标志(0起点,1止点),然后对这些点排序,最后,从头开始扫描排序的结果,遇到起点重叠个数加1,遇到止点重叠个数减1,并且记录好重叠个数的最大值。


,因为算法时间主要消耗在排序上。

摘抄自http://blog.csdn.net/s634772208/article/details/46492651

 我是根据http://blog.csdn.net/jiyanfeng1/article/details/46994235理解的 

代码是自己写的

#include<cstdio>
#include<algorithm>
using namespace std;
int ans,res;
struct node{
	int w;
	int flag;
}q[405];
bool cmp(node a,node b){
	return a.w<b.w;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;int c=0;ans=0;res=0;
		scanf("%d",&n);
		while(n--){
			scanf("%d",&q[c].w); q[c++].flag=0;//起点 
			scanf("%d",&q[c].w); q[c++].flag=1;//止点 
		}
		sort(q,q+c,cmp);
		for(int i=0;i<c;i++)
		{  
			if(q[i].flag==0) ans++;
			  else ans--;
		    res=max(res,ans);
		}
		printf("%d\n",res);
	}
	return 0;
}

### 回答1: 为了合并所有重叠区间,我们可以将区间按照起点进行排序,然后依次将区间加入结果集中。如果加入的区间与结果集中的最后一个区间重叠,则将两个区间合并为一个区间。否则,直接将区间加入结果集。 具体实现方法如下: ```python def merge(intervals): # 对区间进行排序,按照起点从小到大排序 intervals.sort(key=lambda x: x[0]) # 初始化结果集 merged = [] # 遍历每个区间 for interval in intervals: # 如果结果集为空,或者当前区间与结果集中最后一个区间重叠,则将当前区间加入结果集 if not merged or merged[-1][1] < interval[0]: merged.append(interval) # 否则,与结果集中最后一个区间重叠,将两个区间合并为一个区间 else: merged[-1][1] = max(merged[-1][1], interval[1]) return merged ``` 算法的时间复杂度为 $O(nlogn)$,其中 $n$ 为区间的数量。 ### 回答2: 题目要求将重叠区间合并为一个不重叠区间数组。 解题思路: 1. 首先对输入的区间数组按照区间的起始点进行排序,可以使用语言提供的排序函数或手动实现排序算法。 2. 定义一个新的结果数组 result,将排序后的第一个区间 intervals[0] 添加到结果数组中。 3. 遍历排序后的区间数组,如果当前的区间的起始点大于结果数组中最后一个区间的终点,说明当前区间和结果数组的最后一个区间重叠,直接将当前区间添加到结果数组中。 4. 否则,当前区间和结果数组的最后一个区间重叠,需要合并。将结果数组中最后一个区间的终点更新为当前区间和结果数组最后一个区间终点的最大值。 5. 遍历完成后,结果数组中存放的就是合并后的不重叠区间。 以下是代码实现: ```python def merge(intervals): # 按照区间的起始点进行排序 intervals.sort(key=lambda x: x[0]) # 初始化结果数组 result = [intervals[0]] # 遍历区间数组 for i in range(1, len(intervals)): if intervals[i][0] > result[-1][1]: # 当前区间和结果数组最后一个区间重叠 result.append(intervals[i]) else: # 当前区间和结果数组最后一个区间重叠,合并区间 result[-1][1] = max(result[-1][1], intervals[i][1]) return result ``` 时间复杂度分析: 排序的时间复杂度为 O(nlogn),遍历区间数组的时间复杂度为 O(n),因此整体的时间复杂度为 O(nlogn)。空间复杂度为 O(n),用于存储结果数组。 ### 回答3: 要合并重叠区间,需要先将区间按照起始位置进行排序。然后从第一个区间开始遍历,判断当前区间与前面已合并区间的情况。 首先,初始化一个结果数组 result,将第一个区间加入结果数组。 然后,开始遍历剩余的区间。对于当前区间 intervals[i],判断其起始位置是否小于等于前一个合并区间的结束位置。如果是,则表示当前区间与前一个区间重叠,需要进行合并操作。 合并操作的方法是:将前一个合并区间的结束位置更新为当前区间的结束位置与原结束位置中的较大值。这样可以确保合并后的区间仍然包含了原来的两个区间。 如果当前区间与前一个区间重叠,则表示无法合并,直接将当前区间加入结果数组。 最后,遍历完成后,将结果数组返回即可。 下面是具体的实现代码: ```python def merge(intervals): # 按照起始位置进行排序 intervals.sort(key=lambda x: x[0]) # 初始化结果数组 result = [intervals[0]] # 开始遍历剩余的区间 for i in range(1, len(intervals)): # 判断当前区间与前一个区间的情况 if intervals[i][0] <= result[-1][1]: # 合并区间 result[-1][1] = max(result[-1][1], intervals[i][1]) else: # 无法合并,直接加入结果数组 result.append(intervals[i]) # 返回结果数组 return result ``` 以上代码的时间复杂度为 O(nlogn),其中 n 表示区间个数。排序的时间复杂度为 O(nlogn),遍历区间的时间复杂度为 O(n)。总体的时间复杂度为 O(nlogn)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值