我发现我是一个只会常规算法的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;
}