leetcode56-合并区间

在这里插入图片描述在这里插入图片描述我发现我是一个只会常规算法的coder
这道题我的做法就是先把所有区间按左端点排序 这样在前一个区间的左端点小于后一个区间的左端点的情况下 如果前一个区间的右端点值大于等于后一个区间的左端点值也就是它们是有交集的一定可以合并
[1,4] [2,5]
[1,4] [2,3]
但在合并的情况下也要区分上面两种情况 一种是第一个区间的右端点改为第二个区间的右端点 然后删去第二个区间 另一种是直接删去第二个区间 由于C语言在数组中删除元素代价太大我直接给了一个标记即被删除的区间 的左右端点都改为-1 这样在往答案数组中存的时候直接忽略就好了

#define MAX 10000
int compare(const void *p1,const void *p2){
    return ((int**)p1)[0][0]-((int**)p2)[0][0];
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
       int **answer=(int**)malloc(sizeof(int*)*MAX);
       *returnSize=0;
       int i=0,j=0;
       qsort(intervals,intervalsSize,sizeof(intervals[0]),compare);
        for(i=0;i<intervalsSize;i++)
        {
            printf("%d %d",intervals[i][0],intervals[i][1]);
        }
       for(i=0;i<intervalsSize-1;i++)
       {
           if(intervals[i][0]==-1&&intervals[i][1]==-1)
                  continue;
           for(j=i+1;j<intervalsSize;j++)
           {
               if(intervals[j][0]==-1&&intervals[j][1]==-1)
                  continue;
               if( intervals[i][1]>=intervals[j][0])//可以合并
               {
                   if(intervals[i][1]<intervals[j][1])
                        intervals[i][1]=intervals[j][1];
                   intervals[j][0]=-1;
                   intervals[j][1]=-1;
               }
           }
       }
       for(i=0;i<intervalsSize;i++)
       {
           if(!(intervals[i][0]==-1&&intervals[i][1]==-1))
            {
                answer[*returnSize]=(int*)malloc(sizeof(int)*2);
                answer[*returnSize][0]=intervals[i][0];
                answer[*returnSize][1]=intervals[i][1];
                *returnSize+=1;
            }
       }
        *returnColumnSizes = (int *)malloc(*returnSize*sizeof(int));        
        for (i=0; i<*returnSize; i++)
                (*returnColumnSizes)[i] = 2;
       return answer;
}

作为一个菜鸡我每次写完代码后的一个好习惯就是去看看大佬高效率的思路
hhh

——下面的图片是截的leetcode上的题解
在这里插入图片描述在这里插入图片描述

这是我根据以上题解思路写的代码

#define MAX 10000
int compare(const void *p1,const void *p2){
    return ((int**)p1)[0][0]-((int**)p2)[0][0];
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
       int **answer=(int**)malloc(sizeof(int*)*MAX);
       *returnSize=0;
       if(intervalsSize==0)
          return intervals;
       int i=0,j=0;
       qsort(intervals,intervalsSize,sizeof(intervals[0]),compare);
       int left=intervals[0][0];
       int right=intervals[0][1];
       for(i=1;i<intervalsSize;i++)
       {
               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];
               }
        }
         answer[*returnSize]=(int*)malloc(sizeof(int)*2);
          answer[*returnSize][0]=left;
         answer[*returnSize][1]=right;
        *returnSize+=1;
        *returnColumnSizes = (int *)malloc(*returnSize*sizeof(int));        
        for (i=0; i<*returnSize; i++)
                (*returnColumnSizes)[i] = 2;
       return answer;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值