《leetCode》:Merge Intervals

题目

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结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值