leetcode做题笔记56

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

思路一:模拟题意

 int comp(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}

int** merge(int** intervals,int intervalsSize,int* intervalsColSize,int* returnSize,int** returnColumnSizes){
    int* pStart = (int*)malloc(intervalsSize * sizeof(int)); 
    int* pEnd = (int*)malloc(intervalsSize * sizeof(int));
    int row = 0;
    int col = 0;
    *returnSize = 0; // 初始化returnSize
    int** pRes = (int**)malloc(intervalsSize * sizeof(int*));
    for (row = 0; row < intervalsSize; row++)
    {
        pRes[row] = (int*)malloc(*intervalsColSize * sizeof(int));
        pStart[row] = intervals[row][0];
        pEnd[row] = intervals[row][1];
    } 
    *returnColumnSizes = (int*)malloc(intervalsSize * sizeof(int)); 
    qsort(pStart, intervalsSize, sizeof(int), comp);
    qsort(pEnd, intervalsSize, sizeof(int), comp);

    for (row = 0; row < intervalsSize; row++)
    {

        pRes[*returnSize][0] = pStart[row]; 
        for ( ; row <= intervalsSize - 2; row++)
        {
            if (pStart[row + 1] > pEnd[row])
            {
                break;
            }
        }
        pRes[*returnSize][1] = pEnd[row];
        (*returnColumnSizes)[*returnSize] = 2;
        (*returnSize)++;
    }

    return pRes;
}

时间复杂度O(n^2),空间复杂度O(n^2)

分析:

本题要将重叠的数组合并,可以将二维数组内起始数和结尾数分别放置在两个数组中,利用快速排序排列好,再通过判断对应位置的起始数是否大于结尾数,将可重叠的数放置在新的二维数组中返回即可。

总结:

本题难点主要在二维数组的处理上,将*returnColumnSizes处理好便可解决此题。

你可能感兴趣的:(数组的应用,leetcode,笔记,算法)