【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;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值