C语言----合并区间

在这里插入图片描述
题解:什么样的两个区间可以合并?如[1,5],[2,8],后者的左边界值2在前者的前者的区间范围内。所有当把所有区间按照左边界值进行排序,然后看看第i区间能不能和i+1区间合并即可,另外还需考虑如何取出最后的合并区间,对于被合并的区间可以打一个标记,比如第i区间合并到了第i+1区间,则将第i区间打个标记,故最后没有打标记的即是合并的区间,故解题思路如下:
1,将所有区间按照左边界值进行从小到大排序
2,遍历所有区间,如果第i+1区间的左边界值比第i区间的右边界值小,即可合并,更新i+1区间的边界值,并且将第i区间打上标记表示该区间被i+1合并过
3,遍历所有区间,对于打上标记的区间忽略,取出没有打上标记的区间

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

struct Interval
{
	int start;
	int end;
};

int cmp(const void *a, const void *b)
{
	return ((struct Interval*)a)->start - ((struct Interval*)b)->start;
}

struct Interval *merge(struct Interval *intervals, int intervalsLen, int *returnSize)
{
	struct Interval *result = (struct Interval*)malloc(intervalsLen*sizeof(struct Interval));
	int i=0,k=0;
	int flag[intervalsLen];
	memset(flag,0,sizeof(flag));
	qsort(intervals,intervalsLen,sizeof(struct Interval),cmp);

	for(i=0; i<intervalsLen-1; i++)
	{
		if(intervals[i+1].start <= intervals[i].end)
		{
			intervals[i+1].start = intervals[i].start;
			intervals[i+1].end = (intervals[i].end > intervals[i+1].end? intervals[i].end:intervals[i+1].end);
			flag[i] = 1;
		}
	}
	for(i=0; i<intervalsLen; i++)
	{
		if(flag[i] == 1)
			continue;
		result[k++] = intervals[i];
	}
	*returnSize = k;
	return result;
}

int main()
{
	/*
	example 1:{10,30},{20,60},{80,100},{150,180}   result:[10,60],[80,100],[150,180]
	example 2:{10,20},{20,60},{60,100},{100,180}   result:[10,180]
	example 3:{10,20},{30,60},{50,100},{20,180}    result:[10,180]
	*/
	struct Interval intervals[] = {{10,20},{30,60},{50,100},{20,180}};
	int returnSize;
	int i=0;
	struct Interval *result = merge(intervals,4,&returnSize);
	for(i=0; i<returnSize-1; i++)
	{
		printf("[%d,%d],",result[i].start,result[i].end);
	}
	printf("[%d,%d]\n",result[returnSize-1].start,result[returnSize-1].end);
	free(result);
	result = NULL;
	return 0;
}
  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ftzchina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值