目录
- 1.合并区间
-
- 2.无重叠区间
-
- 3.用最少数量的箭引爆气球
-
1.合并区间
1.题目链接
2.算法原理详解
- 区间问题思路:
- 解法:排序(左端点) + 贪心
- 性质:能够合并的区间,都是连续的
- 如何合并?
- 求并集

3.代码实现
vector<vector<int>> merge(vector<vector<int>>& intervals)
{sort(intervals.begin(), intervals.end());vector<vector<int>> ret;int left = intervals[0][0], right = intervals[0][1];for(int i = 0; i < intervals.size(); i++){int a = intervals[i][0], b = intervals[i][1];if(a <= right) {right = max(right, b);}else {ret.push_back({left, right});left = a;right = b;}}ret.push_back({left, right});return ret;
}
2.无重叠区间
1.题目链接
2.算法原理详解
- 解法:排序(左端点) + 贪心
- 问题转化:移除最少区间 <–> 保留更多区间
- 优先干掉右端点长的区间 --> 长的区间更后续区间重叠的概率更大

3.代码实现
int eraseOverlapIntervals(vector<vector<int>>& intervals)
{sort(intervals.begin(), intervals.end());int ret = 0;int left = intervals[0][0], right = intervals[0][1];for(int i = 1; i < intervals.size(); i++){int a = intervals[i][0], b = intervals[i][1];if(a < right) {ret++; right = min(right, b); }else {right = b;}}return ret;
}
3.用最少数量的箭引爆气球
1.题目链接
2.算法原理详解
- 问题抽象:区间问题
- 问题转化:最少的弓箭数量 --> 一只箭应该引爆更多的气球 --> 将互相重叠的所有区间都拿出来引爆
- 解法:排序(左端点) + 贪心
- 性质:按照左端点排序之后,互相重叠的区间是连续的(约束更强)
- 如何合并?
- 求交集

3.代码实现
int findMinArrowShots(vector<vector<int>>& points)
{sort(points.begin(), points.end());int right = points[0][1];int ret = 1;for(int i = 1; i < points.size(); i++){int a = points[i][0], b = points[i][1];if(a <= right) {right = min(right, b);}else {ret++;right = b;}}return ret;
}