0
点赞
收藏
分享

微信扫一扫

力扣 56.合并区间(c语言)

一脸伟人痣 2022-01-17 阅读 78

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.总结

题目难度挺大的吧,我是没做明白,但后面自己看题解慢慢悟出来了,字节跳动的面试题。

希望我也有资格能去字节面试吧。

举报

相关推荐

0 条评论