题解 | #合并区间#
合并区间
http://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a
第一步 排序(start排序完, 在逆序排end)
[1,3], [1,2], [2,6], [2,4], [8,10],[15,18]
分两种情况合并区间
情况1: [1,2], [2,5] 则更新最后一组的end为5, 即[1,5]
情况2: [1,2], [4,8] 则直接插入[4,8]
class Solution {
public:
struct myC{ // 按照第二位进行排序
bool operator()(Interval &a, Interval &b){
return a.start < b.start || (a.start==b.start && a.end>b.end);
}
};
// 第一种情况 [1.4], [2,8] 则更新为[1,8]
// 第二种情况 [1,4], [6,10] 则插入[6,10]
vector<Interval> merge(vector<Interval> &nums) {
if(nums.empty()) return {};
sort(nums.begin(), nums.end(), myC());
vector<Interval> ans;
ans.emplace_back(nums[0]);
for(int i=1, n=nums.size(); i<n; i++){
if(ans.back().end >= nums[i].start && ans.back().end < nums[i].end){
ans.back().end = nums[i].end;
}else if(ans.back().end < nums[i].start){
ans.emplace_back(nums[i]);
}
}
return ans;
}
}; 