合并数组

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

将数组按照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(struct Interval *a,struct Interval *b)
{
    return a->start-b->start;
}
struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
    if(intervalsSize<1)
        return NULL;
    qsort(intervals,intervalsSize,sizeof(struct Interval),cmp);
    int i;
    int size=0;
    struct Interval *a=(struct Interval *)malloc(sizeof(struct Interval));
    a[size].start=intervals[0].start;
    a[size++].end=intervals[0].end;
    for(i=1;i<intervalsSize;i++)
    {
        if(intervals[i].start>a[size-1].end)
        {
            a=(struct Interval *)realloc(a,sizeof(struct Interval)*(size+1));
            a[size].start=intervals[i].start;
            a[size++].end=intervals[i].end;
        }
        else
        {
            a[size-1].end=intervals[i].end>a[size-1].end?intervals[i].end:a[size-1].end;
        }       
    }
    *returnSize=size;
    return a;
}

 

posted @ 2018-07-21 19:04  onlyandonly  阅读(133)  评论(0编辑  收藏  举报