一. 简介
本文记录力扣网上涉及数组方面的编程题,主要以 C语言实现。
二. 力扣上C语言编程题:合并区间(涉及数组)
以数组 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
解题思路:
1. 对输入的二维数组(若干区间)从小到大进行排序;
2. 遍历二维数组,如果区间不重叠则存储该区间,否则,则合并区间。
具体方法:
1. 对输入的二维数组(若干区间)从小到大进行排序;首先根据区间的起始值排序(从小到大),如果相等,则再根据区间的结束值进行排序(从小到大);
2. 遍历二维数组,如果区间不重叠则存储该区间,否则,则合并区间。
重新开辟一个二维数组(二维数组中每个元素存储一个指针,一个指向分配了2个值的堆);
如果(所输入的)二维数组的区间起始值 > 开辟空间中的区间结束值,则区间没有重叠,直接将二维数组该区间存入 所开辟空间;
否则,区间就与所开辟空间的区间重叠了,根据所开辟空间的区间的结束值与二维数组中区间的结束值比较求其中最大值,作为区间结束值。
C代码实现如下:
#include <stdio.h>int small_to_large_sort(const void* a, const void* b) {int* ptr_a = *(int**)a;int* ptr_b = *(int**)b;if(ptr_a[0] == ptr_b[0]) {return ptr_a[1] - ptr_b[1];}else {return ptr_a[0] - ptr_b[0];}
}/*** 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().*/
/*
input_params:intervals:二维数组,表示原始的区间列表intervalsSize:表示传入的intervals 二维数组中有多少个 [start, end] 区间。intervalsColSize: 每个区间有多少列(固定为2)
out_params:returnSize: 合并后有多少个区间(结果的行数)returnColumnSizes:每个区间有多少列(固定为2)
return:int**类型的二维数组
*/
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) {if(!intervalsSize) {return NULL;}int i = 0;int** ret = (int**)malloc(intervalsSize * sizeof(int*));for(i = 0; i < intervalsSize; i++) {int* col = (int*)malloc((*intervalsColSize) * sizeof(int));ret[i] = col;}//对二维数组进行排序(若干区间进行升序)qsort(intervals, intervalsSize, sizeof(intervals[0]), small_to_large_sort);int m, n;for(m = 0, n = -1; m < intervalsSize; m++) {//区间未重叠//如果(所输入的)二维数组的区间起始值 > 开辟空间中的区间结束值,//则区间没重叠,直接将二维数组该区间存入所开辟空间if((n == -1) || (intervals[m][0] > ret[n][1])) { //n=-1表示ret数组为空的情况 ret[++n] = intervals[m];}else { //区间重叠 (否则区间重叠了,根据所开辟空间的区间的结束值与二维数组中区间的结束值 求其中最大值,作为区间结束值。)ret[n][1] = fmax(ret[n][1], intervals[m][1]);}}//返回的区间数目*returnSize = n + 1;*returnColumnSizes = intervalsColSize;return ret;
}
注意:
代码中,当遍历数组进行区间重叠判断时,n 作为所开辟缓存的迭代次数,必须从 -1开始。
n = -1 表示 ret数组为空的情况。