















这个题目是关于一个合并区间的算法题目,我们来看C++的实现
Give multiple intervals, return the merged list之后的集合 比如 [[0,7],[2,3],[4,5]] 输出[0,7], y因为都在0到7的区间
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considered overlapping.
给定一个区间的集合,合并所有重复的区间。
也就是将重复的区间合并成一个大的区间,例如[1,5]和[3,7]将会合并成[1,7]
1. 先将区间按左端点值由小到大排序, 比如 [[2,6],[15,18],[8,10],[1,3]], 按照里面每个区间的左端点排序,排序完成后变成 [[1,3],[2,6],[8,10],[15,18]]
2. 定义一个返回值区间 vector<verctor<int>> res;
3. 先把第1步中排完序的区间中的第1个(位置为0)的区间,也就是上面例子中的[1,3] 放入第2步定义的返回值res中 => 此时 res = [[1,3]]
4. 遍历循环第1步中左端点排序后的区间,从位置1开始(因为位置为0的区间已经放入res中),一个一个循环
每一个区间都和res中的最后一个区间进行比较(刚开始res中只有一个区间,就是[1,3]),
如果比较的这个区间的左端值 < res中最后一个区间的右端值, 那就说明有重叠,把这个区间和res最后一个区间合并成一个新的区间
否则,就是没有重叠,直接把比较的这个区间,放入res的尾部
代码如下
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<vector<int>> merge(vector<vector<int>>& intervals) { if (intervals.empty()) return {}; // Step 1: Sort by start time sort(intervals.begin(), intervals.end()); vector<vector<int>> res; res.push_back(intervals[0]); for (int i = 1; i < intervals.size(); ++i) { auto& last = res.back(); int currStart = intervals[i][0]; int currEnd = intervals[i][1]; if (currStart <= last[1]) { // Overlap: merge last[1] = max(last[1], currEnd); } else { res.push_back({currStart, currEnd}); } } return res; }
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。