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