给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
/* 定义一个数据结构,用于输入的二维数组,目的是为了进行排序 */
typedef struct {
int x;
int y;
}Node;
/* 快速排序的比较函数,以x为标准进行升序 */
int cmpInc(const void *a, const void *b)
{
return ((Node *)a)->x - ((Node *)b)->x;
}
/**
* 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** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
/* 异常判断 */
if (intervalsSize == 0 || intervals == NULL) {
*returnSize = intervalsSize;
return intervals;
}
Node *n = NULL;
int** rslt = NULL;
int num = 0;
n = (Node *)malloc(sizeof(Node) * intervalsSize); /* 开辟结构体数组 */
rslt = (int **)malloc(sizeof(int *) * intervalsSize); /* 开辟二维数组用于保存结果 */
/* 开辟二维数组并且赋值为0 */
for (int i = 0; i < intervalsSize; i++) {
*(rslt + i) = (int *)malloc(sizeof(int) * 2);
rslt[i][0] = 0;
rslt[i][1] = 0;
}
/* 将二维数组赋给结构体数组 */
for (int i = 0; i < intervalsSize; i++) {
n[i].x = intervals[i][0];
n[i].y = intervals[i][1];
}
/* 快速排序,以结构体成员x为关键字 */
qsort(n, intervalsSize, sizeof(Node), cmpInc);
rslt[0][0] = n[0].x;
rslt[0][1] = n[0].y;
for (int i = 1; i < intervalsSize; i++) {
if (rslt[num][1] < n[i].x) {
num++;
rslt[num][0] = n[i].x;
rslt[num][1] = n[i].y;
} else {
rslt[num][1] = (rslt[num][1] < n[i].y) ? n[i].y : rslt[num][1];
}
}
num++;
/* 注意题目中的条件 */
*returnSize = num;
*returnColumnSizes = (int *)malloc(sizeof(int) * num);
for (int i = 0; i < num; i++) {
(*returnColumnSizes)[i] = 2;
}
return rslt;
}