[LintCode 1668.] 区间最小覆盖
1668. 区间最小覆盖
CAT 专属题目
数轴上有 n 个区间. 现在需要在数轴上选取一些点, 使得任意一个区间内至少包含一个点.
返回最少选取的点的数目.
样例
样例 1:
输入: [(1,5), (4,8), (10,12)]
输出: 2
解释:
选择两个点: 5, 10
第一个区间 [1, 5] 包含了 5
第二个区间 [4, 8] 包含了 5
第三个区间 [10, 12] 包含了 10
样例 2:
输入: [(1,5), (4,8), (5,12)]
输出: 1
解释: 所有区间都包含 5
注意事项
- 1 <= n <= 10^4
- 保证给定的区间合法, 且区间左右端点在[0, 10^5] 范围内
- 给定的都是闭区间
按照开始时间排序选结束时间点,会漏掉开始晚结束早的。比如[(1,4),(2,3),(4,6)]
,按开始时间排序后,第一次选的是4
,跳过第二个区间,判断第三个区间也能覆盖,得到答案为1。实际上第二个区间被忽视了,4
这个点并不能覆盖(2,3)
这个区间。
按照结束时间排序选结束时间点就没问题了。
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
* }
*/
class Solution {
public:
/**
* @param a: the array a
* @return: return the minimal points number
*/
int getAns(vector<Interval> &a) {
// write your code here
if (a.empty()) return 0;
std::sort(a.begin(), a.end(), cmp);
int res = 1;
int selected = a[0].end;
for (int i=1; i<a.size(); i++) {
if (a[i].start <= selected) continue;
else {
selected = a[i].end;
res++;
}
}
return res;
}
static bool cmp(const Interval& lhs, const Interval& rhs) {
if (lhs.end != rhs.end)
return lhs.end < rhs.end;
return lhs.start < rhs.start;
}
};