leetcode57-插入区间

在这里插入图片描述在这里插入图片描述在上一题的基础上先折半查找找到新区间要插入的位置然后要特别注意插入到最后一个位置和第一个位置的情况其余大体上和上一题思路差不多

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值