题目描述
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
示例
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-overlapping-intervals
实现
int compare(const int **a, const int **b)
{
return (*a)[1] - (*b)[1];
}
// 要移除最小数量的区间,就是说要移除的那个区间右边界更长(右边界更长,就更可能与更多区间重叠)
int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize)
{
int total = 0; // 记录要移除的个数
int prev = 0; // 记录前一个右边界
// 1. 按照右边界排序
qsort(intervals, intervalsSize, sizeof(int*), compare);
prev = intervals[0][1];
// 2. 从左到右选择
for (int i = 1; i < intervalsSize; i++) {
if (intervals[i][0] < prev) { // 重叠了,把右边界大的移除
total++;
} else {
prev = intervals[i][1];
}
}
return total;
}