题目说明
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
这里我主要讲一下要用到的那个qsort() 函数
函数原型:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void , const void))
参数
- base-- 指向要排序的数组的第一个元素的指针。
- nitems-- 由 base 指向的数组中元素的个数。
- size-- 数组中每个元素的大小,以字节为单位。
- compar-- 用来比较两个元素的函数,即函数指针(回调函数)
以及里面的compar() 函数
函数原型:
int compar(const void *p1, const void *p2);
我们写了一个comp() 函数来执行这个步骤,comp会返回一个整数给qsort() 。然后qsort 会按照下面的规则进行操作元素。
- 如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
- 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
- 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。
力扣编译器运行
/**
* 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().
*/
//下面定义的四个常量,因为后面没有数值,所以编译器会自动省略,这里只是为了代码规范。
// 定义输入输出参数
#define IN
#define OUT
// 定义框架
#define __________FRAME_START__________
#define __________FRAME_END__________
//为后面的qsort() 函数调用时使用
static int comp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
//intervals 数组指针,intervalsSize 数组行数,intervalsColSize 数组列数指针
//returnSize 返回数组行数,returnColumnSizes 返回数组列数的指针
int** merge(IN int** intervals, IN int intervalsSize, IN int* intervalsColSize, OUT int* returnSize, OUT int** returnColumnSizes){
//划分空间,等一下用来存储代表开头和结束两个不同的数据
int* pStart = (int*)malloc(intervalsSize * sizeof(int));
int* pEnd = (int*)malloc(intervalsSize * sizeof(int));
__________FRAME_START__________
int row = 0; // 定义行列
int col = 0; //定义列数
*returnSize = 0; // 初始化returnSize
//在堆空间中分配二维数组,用malloc
//定义返回数组的二级指针,元素个数为行数
int** pRes = (int**)malloc(intervalsSize * sizeof(int*));
//创建返回数组,并将数据分类
for (row = 0; row <= intervalsSize - 1; row++) //以行数来作为循环结束条件
{
pRes[row] = (int*)malloc(*intervalsColSize * sizeof(int)); // 为每个结点分配一个数组空间,元素个数为列数
//数据分类,开头数字存放到开始(pStart)数组中,结尾数字同理
pStart[row] = intervals[row][0]; //将区间的开头数字存放到pStart 数组中
pEnd[row] = intervals[row][1]; //将区间的结束数字存放到pEnd 数组中
}
//初始化指针,元素个数为行数,每个元素用来存放该行的列数
*returnColumnSizes = (int*)malloc(intervalsSize * sizeof(int));
__________FRAME_END__________
//将pStart 和 pEnd 两个数据按照从小到大的顺序进行排序
qsort(pStart, intervalsSize, sizeof(int), comp);
qsort(pEnd, intervalsSize, sizeof(int), comp);
for (row = 0; row <= intervalsSize - 1; row++)
{
__________FRAME_START__________
// 为返回数组的开头赋值,此处用到了returnSize指针变量,其内容是行数下标,因此注意要加*
pRes[*returnSize][0] = pStart[row];
//判断是否有开头小于上一个结尾的,如果有则合并到上一个数组中
for ( ; row <= intervalsSize - 2; row++)
{
if (pStart[row + 1] > pEnd[row])
{
break;
}
}
//为返回数组的结尾赋值
pRes[*returnSize][1] = pEnd[row];
//为returnColumnSizes 赋值列数值
//注意[]的优先级比*高,所以要加括号。因为我们是为*returnColumnSizes 分配的空间,没对returnColumnSizes分配过空间
(*returnColumnSizes)[*returnSize] = 2;
//进入下一列
(*returnSize)++;
__________FRAME_END__________
}
//返回合并好的数组
return pRes;
}
本月更新进度 5/15
创作不易,你的点赞是我最大的动力!!!
我们下次再见 end~