在上一题的基础上先折半查找找到新区间要插入的位置然后要特别注意插入到最后一个位置和第一个位置的情况其余大体上和上一题思路差不多
int find(int** intervals, int intervalsSize,int* newInterval, int newIntervalSize)
{
int left=0;
int right=intervalsSize-1;
int mid=0;
while(left<=right)
{
mid=(left+right)/2;
if(newInterval[0]==intervals[mid][0])
{
if(newInterval[1]<=intervals[mid][1])
return mid;
else
return mid+1;
}
else if(newInterval[0]>intervals[mid][0])
left=mid+1;
else
right=mid-1;
}
return left;
}
#define MAX 10000
int** insert(int** intervals, int intervalsSize, int* intervalsColSize, int* newInterval, int newIntervalSize, int* returnSize, int** returnColumnSizes){
int **answer=(int**)malloc(sizeof(int*)*MAX);
*returnSize=0;
if(intervalsSize==0)
{
answer[*returnSize]=(int*)malloc(sizeof(int)*2);
answer[*returnSize][0]=newInterval[0];
answer[*returnSize][1]=newInterval[1];
*returnSize+=1;
return answer;
}
int i=0,j=0;
int index=find(intervals, intervalsSize,newInterval, newIntervalSize);
//qsort(intervals,intervalsSize,sizeof(intervals[0]),compare);
int left=intervals[0][0];
int right=intervals[0][1];
int flag=1;
if(index==0)
{
left=newInterval[0];
right=newInterval[1];
}
for(i=0;i<intervalsSize;)
{
if(i==index&&flag)
{
if(newInterval[0]<=right)
{
if(newInterval[1]>right)
right=newInterval[1];
}
else
{
answer[*returnSize]=(int*)malloc(sizeof(int)*2);
answer[*returnSize][0]=left;
answer[*returnSize][1]=right;
*returnSize+=1;
left=newInterval[0];
right=newInterval[1];
}
flag=0;
}
else
{
if(intervals[i][0]<=right)//可以合并
{
if(intervals[i][1]>right)
right=intervals[i][1];
}
else
{
answer[*returnSize]=(int*)malloc(sizeof(int)*2);
answer[*returnSize][0]=left;
answer[*returnSize][1]=right;
*returnSize+=1;
left=intervals[i][0];
right=intervals[i][1];
}
i++;
}
}
answer[*returnSize]=(int*)malloc(sizeof(int)*2);
answer[*returnSize][0]=left;
answer[*returnSize][1]=right;
*returnSize+=1;
if(index==intervalsSize)
{
if(newInterval[0]<=answer[*returnSize-1][1])
{
if(newInterval[1]>answer[*returnSize-1][1])
answer[*returnSize-1][1]=newInterval[1];
}
else
{
answer[*returnSize]=(int*)malloc(sizeof(int)*2);
answer[*returnSize][0]=newInterval[0];
answer[*returnSize][1]=newInterval[1];
*returnSize+=1;
}
}
*returnColumnSizes = (int *)malloc(*returnSize*sizeof(int));
for (i=0; i<*returnSize; i++)
(*returnColumnSizes)[i] = 2;
return answer;
}