题目
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
题目大意:将有重叠间隔的区域的进行合并。
思路
此题也比较简单。先将数组intervals按start进行排序,然后再来合并即可
实现代码如下:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* };
*/
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp(const void *a,const void *b){
return ((struct Interval*)a)->start-(((struct Interval*)b)->start);
}
int max(int a,int b){
return a>=b?a:b;
}
struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
if(intervals==NULL||intervalsSize<1){
*returnSize=0;
return NULL;
}
if(intervalsSize==1){
*returnSize=1;
return intervals;
}
//排序
qsort(intervals,intervalsSize,sizeof(intervals[0]),cmp);
//开辟一段空间来保存结果
struct Interval *result=(struct Interval *)malloc(intervalsSize*sizeof(struct Interval));
if(result==NULL){
exit(EXIT_FAILURE);
}
int index=0;//result数组的下标
//开始遍历合并
int start=intervals[0].start;
int end=intervals[0].end;
for(int i=1;i<intervalsSize;i++){
if(intervals[i].start<=end){//有重叠,开始合并
end=max(end,intervals[i].end);//取大的值
}
else{//说明,没有重叠,保存结果
result[index].start=start;
result[index].end=end;
index++;
//更新start和end
start=intervals[i].start;
end=intervals[i].end;
}
}
//将最后一段的结果进行保存
result[index].start=start;
result[index].end=end;
index++;
*returnSize=index;
return result;
}
遇到的问题
1、没有考虑到下面截图所示的这种情况的测试用例
解决方法就是:在合并之后的end取之前两段较大的end值;在代码上面的表现如下:
if(intervals[i].start<=end){//有重叠,开始合并
end=max(end,intervals[i].end);//取大的值
}
最后AC结果如下: