数组合并区间

一、题目要求数组合并区间_第1张图片

二、解法

数组合并区间_第2张图片
数组合并区间_第3张图片
数组合并区间_第4张图片

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 是一个 C++ 中的数据类型,表示一个二维向量,也可以看作是一个二维数组。vector 可以用来表示矩阵、网格等二维数据结构,也可以用来存储二维坐标、区间等多个一维数据结构的集合。

vector& intervals:这是一个 C++ 函数参数,参数名为 intervals,类型为 vector 的二维向量的引用,表示一个区间列表。使用引用参数的好处是可以避免在函数调用时进行复制,节省了时间和空间。在函数内部对引用参数的修改会反映到原始变量上,因为引用实际上是原始变量的别名。vector 表示一个二维向量,其中每个内部向量表示一个区间,有两个元素:区间的起点和终点。引用参数 &intervals 表示函数会修改原始变量 intervals 中的值,而不是对它进行复制。

#include 
#include 

// 自定义结构体 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 数组,或者在函数调用之后使用排序后的数组进行操作。

你可能感兴趣的:(力扣,c++,算法,数据结构)