【题解】合并区间

题目说明
给出一个区间的集合,请合并所有重叠的区间。

示例 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~

【题解】合并区间_第1张图片

你可能感兴趣的:(#,算法题解)