题意:给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
怎么判断区间有没有重叠呢?
unorderd_map是哈希表,查找快
msp用的是红黑树,效率要比unorder_map低一点
遍历一个去接就往map里边放值,如果遍历的数组的内容的map已经存在了,那就认为重叠了,直接删掉就行
但是这种办法是没办法做删减的,顶多判断是否是重复区间
这种需要取舍的题目,肯定是要用贪心算法的,目前暂无思路
参见大佬的做法
大佬思路:计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数
怎么计算最多能组成的不重叠区间的个数呢(这个题总感觉做过)
由于每次选择时,选择的区间结尾越小,留给后边的区间的空间就越大,那么后边能够选择的区间个数就越(保证每次选择的区间的覆盖范围是最小的,同时也不能和前边的区间重复)
中心思想:
class Solution {
public:
//因为已经排序了,所以我选的肯定是右边界最小的,那我不用在意边界,直接找不重复的就行,注意从左往右遍历
static bool comp(const vector<int>& a, const vector<int>& b)
{
return a[1] < b[1];
}
int eraSEOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size() == 0)return 0;
sort(intervals.begin(), intervals.end(), comp);
//怎么保证不重复,需要有一个指针指向上界,然后去检查这个上界在不在后边遍历数组元素的区间内,在就重复,不在就count++,注意因为第一个元素默认不重复,所以count初始化为1,同时遍历的时候也从1开始遍历
int tmp = intervals[0][1], count = 1;
for (int i = 1; i < intervals.size(); i++)//从左到右遍历
{
if (intervals[i][0] >= tmp) { count++; tmp = intervals[i][1]; }
}
return intervals.size() - count;
}
};