【
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
见到数组先排序,这次是二维排序。
然后双指针:
- int Comp(const void **a, const void **b) {
- int *one = *(int **)a;
- int *two = *(int **)b;
-
- if (one[0] == two[0]) {
- return one[1] - two[1];
- } else {
- return one[0] - two[0];
- }
- }
-
- int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
- int i;
- int left = 0;
- int right = 0;
- int **retarr;
- int idx = 0;
-
- retarr = (int **)malloc(sizeof(int *) * intervalsSize);
- for ( i = 0; i < intervalsSize; i++) {
- retarr[i] = (int *)malloc(sizeof(int) *2);
- memset(retarr[i], 0, sizeof(int) *2);
- }
-
- returnColumnSizes[0] = (int *)malloc(sizeof(int) * intervalsSize);
- for (i = 0; i < intervalsSize; i++) {
- returnColumnSizes[0][i] = 2;
- }
-
- qsort(intervals, intervalsSize, sizeof(intervals[0]), Comp);
-
- left = intervals[0][0];
- right = intervals[0][1];
- for (i = 1; i < intervalsSize; i++){
- if ((intervals[i][0] >= left) && (intervals[i][0] <= right) && (intervals[i][1] > right)) {
- right = intervals[i][1];
- } else if (intervals[i][0] > right) {
- retarr[idx][0] = left;
- retarr[idx][1] = right;
- left = intervals[i][0];
- right = intervals[i][1];
- idx++;
- }
- }
-
- retarr[idx][0] = left;
- retarr[idx][1] = right;
- idx++;
-
- *returnSize = idx;
-
- return retarr;
- }