《leetCode》:Insert Interval

题目

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

题目大意:将插入的间隔与原来的已排序的间隔数组,如果存在间隔重叠,则进行合并。

思路

第一种思路:可以借鉴上篇博文的思路,将这个newInterval根据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().
 */
//思路:通过遍历,在intervals中
int min(int a,int b){
    return a<=b?a:b;
}
int max(int a,int b){
    return a>=b?a:b;
}
struct Interval* insert(struct Interval* intervals, int intervalsSize, struct Interval newInterval, int* returnSize) {
//    if(intervals==NULL||intervalsSize<1){//特殊情况 
//      *returnSize=1;
//      return &newInterval; 
//  }   
    struct Interval* result=(struct Interval*)malloc((intervalsSize+1)*sizeof(struct Interval));
    if(result==NULL){
        exit(EXIT_FAILURE);
    }
    int index=0;
    int index1=-1;
    for(int i=0;i<intervalsSize;i++){
        if(newInterval.end<intervals[i].start){
            index1=i;//数组中从index1开始就与newInterval就没有重叠 
            break;
        }
        else if(newInterval.start>intervals[i].end){//也与newInterval没有重叠,将其保存即可 
            result[index]=intervals[i];
            index++;
        } 
        else{//newInterval.start<intervals[i].end&&newInterval.end>intervals[i].start;有重叠 
            //更新即可
            newInterval.start=min(newInterval.start,intervals[i].start);
            newInterval.end=max(newInterval.end,intervals[i].end); 
        } 
    }
    result[index]=newInterval;
    index++;
    if(index1!=-1){//要判断下是否还有元素要放入到结果中去 
        for(int j=index1;j<intervalsSize;j++){
            result[index]=intervals[j];
            index++;
        } 
    }

    *returnSize=index;
    return result;

}

AC结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值