1.题目描述
2.核心思路
先对给的二维数组整体排序,因为每一行只有两个数,要是可以合并的区间,那么一行的最后一个数,一定要比下一行第一个数大或相等。
3.代码实现
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int cmp(const void* a,const void* b)
{
int** p=(int**)a;
int** q=(int**)b;
return (**p)-(**q);
}
int max(int a,int b)
{
return a>b?a:b;
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
int** res=(int**)malloc(sizeof(int*)*intervalsSize);//开辟最大行数
*returnColumnSizes=(int*)malloc(sizeof(int)*intervalsSize);//告诉系统我们每一行放几个
qsort(intervals,intervalsSize,sizeof(intervals),cmp);
int mask[intervalsSize];//算每一行,要大一点也行
memset(mask,0,sizeof(mask));
for(int i=0;i<intervalsSize-1;i++)
{
if(intervals[i][1]>=intervals[i+1][0])
{
intervals[i+1][0]=intervals[i][0];
intervals[i+1][1]=max(intervals[i][1],intervals[i+1][1]);
mask[i]=1;
}
}
int k=0;
for(int i=0;i<intervalsSize;i++)
{
if(mask[i]==1)
{
continue;
}
res[k]=(int*)malloc(sizeof(int)*2);
returnColumnSizes[0][k]=2;//每一行放2个
memcpy(res[k],intervals[i],sizeof(res[k]));
k++;
}
*returnSize=k;//有几行
return res;
}
4.总结
题目难度挺大的吧,我是没做明白,但后面自己看题解慢慢悟出来了,字节跳动的面试题。
希望我也有资格能去字节面试吧。