0
点赞
收藏
分享

微信扫一扫

[数组]BM89 合并区间-简单

​​BM89 合并区间​​

知识点​​排序​​​​数组​​

描述

给出一组区间,请合并所有重叠的区间。请保证合并后的区间按区间起点升序排列。

数据范围:区间组数 [数组]BM89 合并区间-简单_数据,区间内 的值都满足 [数组]BM89 合并区间-简单_排序_02要求:空间复杂度 [数组]BM89 合并区间-简单_排序_03,时间复杂度 [数组]BM89 合并区间-简单_排序_04进阶:空间复杂度 [数组]BM89 合并区间-简单_区间合并_05,时间复杂度[数组]BM89 合并区间-简单_区间合并_05

示例1

输入:

[[10,30],[20,60],[80,100],[150,180]]

复制返回值:

[[10,60],[80,100],[150,180]]

复制

示例2

输入:

[[0,10],[10,20]]

复制返回值:

[[0,20]]


题解

思路:

  1. 如果输入为空,返回空
  2. 对输入进行排序,此时需要给std::sort指定排序函数
  3. 将排序后的第一个元素放入结果中v
  4. 遍历排序后的输入数据,比较v.back和当前元素的值,决定是合并,还是放入v的后面

代码如下:

#include <bits/stdc++.h>

struct Interval
{
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};

std::vector<Interval> merge(std::vector<Interval> &intervals)
{
std::vector<Interval> v;
if (intervals.empty())
{
return v;
}
std::sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b)
{
if (a.start < b.start)
{
return true;
}
if (b.start < a.start)
{
return false;
}
return a.end < b.end; });

v.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); ++i)
{
const auto &x = intervals[i];
if (x.start >= v.back().start && x.start <= v.back().end)
{
v.back().end = std::max(x.end, v.back().end);
}
else
{
v.push_back(x);
}
}
return v;
}
举报

相关推荐

0 条评论