西宁好的网站建设公司,著名咨询公司有哪些,做网站属于什么备案,什么是响应式网站建设文章目录力扣56.合并区间题目描述排序合并力扣56.合并区间
题目描述
以数组 intervals 表示若干个区间的集合#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间#xff0c;并返回 一个不重叠的区间数组#xff0c;该数组需恰好覆盖输入中…
文章目录力扣56.合并区间题目描述排序合并力扣56.合并区间
题目描述
以数组 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
排序合并
排序合并的思想力扣官方的解答蛮好的可以直接点下面链接看一下这里我偷个懒只提供官方没有给出的C语言代码实现 力扣官方思路链接
官解搬运 如果我们按照区间的左端点排序那么在排完序的列表中可以合并的区间一定是连续的。如下图所示标记为蓝色、黄色和绿色的区间分别可以合并成一个大区间它们在排完序的列表中是连续的 算法
我们用数组 merged 存储最终的答案。
首先我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入 merged 数组中并按顺序依次考虑之后的每个区间 如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后那么它们不会重合我们可以直接将这个区间加入数组 merged 的末尾 否则它们重合我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点将其置为二者的较大值。
C语言版代码实现冒泡排序版本
/*** 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){int i,j,pre-1,*t,base100;int **results(int **)malloc(sizeof(int *)*base);*returnColumnSizes(int *)malloc(sizeof(int)*intervalsSize);*returnSize0;for(i1;iintervalsSize;i){for(j0;jintervalsSize-i;j){if(intervals[j][0]intervals[j1][0]){tintervals[j];intervals[j]intervals[j1];intervals[j1]t;}}}for(i0;iintervalsSize;i){if(intervals[i][0]pre){results[*(returnSize)](int *)calloc(sizeof(int),2);(*returnColumnSizes)[*returnSize]2;results[(*returnSize)][0]intervals[i][0];results[(*returnSize)][1]intervals[i][1];preintervals[i][1];if(*returnSizebase){base*2;results(int **)realloc(results,sizeof(int *)*base);}}else{results[(*returnSize)-1][1]fmax(intervals[i][1], results[(*returnSize)-1][1]);preresults[(*returnSize)-1][1];}}return results;
}