以数组 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; // 初始化returnSizeint** 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处理好便可解决此题。