合并区间

给出一个数组,每个元素是一个区间,题目要求将重叠的区间进行合并,首先我们根据区间的左顶点值进行排序,排序之后的区间,需要合并的一定相邻,在看完标准答案之后,我学会了对vectorback元素直接进行修改,程序代码如下,这里排序我使用了快速排序:

void quicksort(int left, int right, vector<vector>& intervals)
{
    if(left >= right)
        return;
    int i, j, base, base_right,temp;
    i = left, j = right;
    base = intervals[left][0];
    base_right = intervals[left][1];
    while (i < j)
    {
        while (intervals[j][0] >= base && i < j)
            j--;
        while (intervals[i][0] <= base && i < j)
            i++;
        if(i < j)
        {
            temp = intervals[i][0];
            intervals[i][0] = intervals[j][0];
            intervals[j][0] = temp;
            temp = intervals[i][1];
            intervals[i][1] = intervals[j][1];
            intervals[j][1] = temp;
        }
    }
    intervals[left][0] = intervals[i][0];
    intervals[left][1] = intervals[i][1];
    intervals[i][0] = base;
    intervals[i][1] = base_right;
    quicksort(left, i - 1, intervals);
    quicksort(i + 1, right, intervals);
}
 
vector<vector> merge(vector<vector>& intervals) 
{
    if (intervals.size() == 0) {
        return {};
    }
    quicksort(0, intervals.size()-1, intervals);
    vector<vector> 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;
}

posted @ 2020-04-16 20:34  ~吹梦到西洲~  阅读(193)  评论(0编辑  收藏  举报