【Leetcode】435. 无重叠区间

题意:给定一个间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

怎么判断区间有没有重叠呢?
unorderd_map是哈希表,查找快
msp用的是红黑树,效率要比unorder_map低一点
遍历一个去接就往map里边放值,如果遍历的数组的内容的map已经存在了,那就认为重叠了,直接删掉就行
但是这种办法是没办法做删减的,顶多判断是否是重复区间

这种需要取舍的题目,肯定是要用贪心算法的,目前暂无思路
参见大佬的做法

大佬思路:计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数
怎么计算最多能组成的不重叠区间的个数呢(这个题总感觉做过)
由于每次选择时,选择的区间结尾越小,留给后边的区间的空间就越大,那么后边能够选择的区间个数就越(保证每次选择的区间的覆盖范围是最小的,同时也不能和前边的区间重复)

中心思想:

  1. 间的结尾越小,可选择的范围越大
  2. 将移除区间不重叠,转换成直接找到不重叠的最大区间书
  3. sort排序的时候可以利用可调用对象按照自己需要的方式进行排序
    AC Code
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;
	}
};

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...