合并区间(C++解法)

题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

C++代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

/*
* 合并区间问题
* 排序,定义区间的左右两边数字
* 如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,
那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾
* 否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点
*/
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;
}

int main() {
	vector<vector<int>> intervals = { {1,3},{2,6},{8,10},{15,18} };
	vector<vector<int>> merged = merge(intervals);
	for (int i = 0; i < merged.size(); ++i) {
		for (int j = 0; j < merged[0].size(); ++j) {
			cout << merged[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

分析

合并区间问题,排序,定义区间的左右两边数字。如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点。

猜你喜欢

转载自blog.csdn.net/m0_62275194/article/details/133990585
今日推荐