一、题目要求
二、解法
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0) {
return {};
}
sort(intervals.begin(), intervals.end());
vector<vector<int>> merged;
for (int i = 0; i < intervals.size(); ++i) {
int L = intervals[i][0], R = intervals[i][1];
if (!merged.size() || merged.back()[1] < L) {
merged.push_back({L, R});
}
else {
merged.back()[1] = max(merged.back()[1], R);
}
}
return merged;
}
};
代码解释:
(1)vector<vector> 是一个 C++ 中的数据类型,表示一个二维向量,也可以看作是一个二维数组。vector<vector> 可以用来表示矩阵、网格等二维数据结构,也可以用来存储二维坐标、区间等多个一维数据结构的集合。
vector<vector>& intervals:这是一个 C++ 函数参数,参数名为 intervals,类型为 vector<vector> 的二维向量的引用,表示一个区间列表。使用引用参数的好处是可以避免在函数调用时进行复制,节省了时间和空间。在函数内部对引用参数的修改会反映到原始变量上,因为引用实际上是原始变量的别名。vector<vector> 表示一个二维向量,其中每个内部向量表示一个区间,有两个元素:区间的起点和终点。引用参数 &intervals 表示函数会修改原始变量 intervals 中的值,而不是对它进行复制。
#include <stdio.h>
#include <stdlib.h>
// 自定义结构体 Interval 表示区间
typedef struct {
int start;
int end;
} Interval;
// 自定义比较函数,用于结构体 Interval 的排序
int compareInterval(const void* a, const void* b) {
return ((Interval*)a)->start - ((Interval*)b)->start;
}
Interval* merge(Interval* intervals, int intervalsSize, int* returnSize) {
if (intervalsSize == 0) {
*returnSize = 0;
return NULL;
}
// 对区间按照左端点排序
qsort(intervals, intervalsSize, sizeof(Interval), compareInterval);
// 初始化合并后的区间数组 merged
Interval* merged = (Interval*)malloc(intervalsSize * sizeof(Interval));
int count = 0;
// 将第一个区间加入 merged 中
merged[count++] = intervals[0];
// 遍历所有区间,合并重叠的区间
for (int i = 1; i < intervalsSize; i++) {
// 如果当前区间与 merged 中最后一个区间不重叠,将当前区间加入 merged 中
if (merged[count - 1].end < intervals[i].start) {
merged[count++] = intervals[i];
}
// 如果当前区间与 merged 中最后一个区间重叠,将它们合并
else {
merged[count - 1].end = merged[count - 1].end > intervals[i].end ? merged[count - 1].end : intervals[i].end;
}
}
// 返回合并后的区间数组
*returnSize = count;
return merged;
}
int main() {
Interval intervals[] = {{1,3},{2,6},{8,10},{15,18}};
int intervalsSize = sizeof(intervals) / sizeof(intervals[0]);
int returnSize;
Interval* merged = merge(intervals, intervalsSize, &returnSize);
for (int i = 0; i < returnSize; i++) {
printf("[%d,%d] ", merged[i].start, merged[i].end);
}
printf("\n");
free(merged);
return 0;
}
代码解释:
(1)qsort(intervals, intervalsSize, sizeof(Interval), compareInterval);
这是一个 C 库函数 qsort,用于对数组进行快速排序。它的函数原型为:
void qsort(void* base, size_t num, size_t size, int (compare)(const void, const void*));
其中,base 是待排序数组的起始地址,num 是数组中元素的个数,size 是每个元素的大小,compare 是一个函数指针,用于指定排序规则。
在这个例子中,我们将 intervals 数组作为待排序数组,intervalsSize 表示数组中元素的个数,sizeof(Interval) 表示每个元素的大小,compareInterval 是自定义的比较函数,用于指定按照什么规则进行排序。因为我们希望按照每个区间的左端点从小到大排序,所以自定义的 compareInterval 函数按照左端点大小进行比较,函数返回值为负数表示第一个参数小于第二个参数,返回值为正数表示第一个参数大于第二个参数,返回值为 0 表示两个参数相等。
qsort 函数会对 intervals 数组进行原地排序,即不会创建新的数组,排序后 intervals 数组中的元素顺序会发生改变。因此,在排序之前需要注意备份原始的 intervals 数组,或者在函数调用之后使用排序后的数组进行操作。