題目
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].
分析
給定一組區(qū)間欠气,合并所有重復(fù)的區(qū)間哭廉。然后以左端點排序,依次判斷兩個區(qū)間是否出現(xiàn)重復(fù),合并或者保存即可。
void sort(struct Interval *a, int left, int right)//快速排序
{
if(left >= right)/*如果左邊索引大于或者等于右邊的索引就代表已經(jīng)整理完成一個組了*/
{
return ;
}
int i = left;
int j = right;
int key = a[left].start;
int temp=a[left].end;
while(i < j) /*控制在當(dāng)組內(nèi)尋找一遍*/
{
while(i < j && key <= a[j].start)
/*而尋找結(jié)束的條件就是翘瓮,1箱舞,找到一個小于或者大于key的數(shù)(大于或小于取決于你想升
序還是降序)2遍坟,沒有符合條件1的,并且i與j的大小沒有反轉(zhuǎn)*/
{
j--;/*向前尋找*/
}
a[i].start = a[j].start;
a[i].end=a[j].end;
/*找到一個這樣的數(shù)后就把它賦給前面的被拿走的i的值(如果第一次循環(huán)且key是
a[left]晴股,那么就是給key)*/
while(i < j && key >= a[i].start)
/*這是i在當(dāng)組內(nèi)向前尋找愿伴,同上,不過注意與key的大小關(guān)系停止循環(huán)和上面相反电湘,
因為排序思想是把數(shù)往兩邊扔隔节,所以左右兩邊的數(shù)大小與key的關(guān)系相反*/
{
i++;
}
a[j].start = a[i].start;
a[j].end=a[i].end;
}
a[i].start = key;/*當(dāng)在當(dāng)組內(nèi)找完一遍以后就把中間數(shù)key回歸*/
a[i].end=temp;
sort(a, left, i - 1);/*最后用同樣的方式對分出來的左邊的小組進行同上的做法*/
sort(a, i + 1, right);/*用同樣的方式對分出來的右邊的小組進行同上的做法*/
/*當(dāng)然最后可能會出現(xiàn)很多分左右,直到每一組的i = j 為止*/
}
/**
* 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().
*/
struct Interval* merge(struct Interval* intervals, int intervalsSize, int* returnSize) {
struct Interval *ans=(struct Interval *)malloc(sizeof(struct Interval)*intervalsSize);
if(intervalsSize==0)
return ans;
*returnSize=0;
sort(intervals,0,intervalsSize-1);
int p=intervals[0].start,q=intervals[0].end;
//for(int i=0;i<intervalsSize;i++)
//{
// printf("%d %d\n",intervals[i].start,intervals[i].end);
//}
for(int i=1;i<intervalsSize;i++)
{
if(q>=intervals[i].start)
{
if(q<intervals[i].end)
q=intervals[i].end;
}
else
{
ans[*returnSize].start=p;
ans[*returnSize].end=q;
*returnSize=*returnSize+1;
p=intervals[i].start;
q=intervals[i].end;
}
}
ans[*returnSize].start=p;
ans[*returnSize].end=q;
*returnSize=*returnSize+1;
return ans;
}