题解:什么样的两个区间可以合并?如[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;
}