不重叠区间链接链接:https://leetcode-cn.com/problems/non-overlapping-intervals给定一组区间,求最少需要的区间数被删除,以便剩余的间隔不会相互重叠。注意:可以认为一个区间的结束总是大于它的开始。区间[1,2]和[2,3]的边界相互“接触”,但不重叠。示例1:输入:[[1,2],[2,3],[3,4],[1,3]]输出:1解释:移除[1,3]后,剩余区间不重叠。示例2:输入:[[1,2],[1,2],[1,2]]输出:2解释:您需要删除两个[1,2]以使剩余的区间不重叠。示例3:输入:[[1,2],[2,3]]输出:0解释:您不需要删除任何区间,因为它们已经不重叠。相信很多同学看到这道题都觉得需要排序,但是到底应该按照右边界排序还是按照左边界排序呢?这其实是一个难点!要按照右边界排序,就必须从左到右遍历,因为右边界越小越好,只要右边界越小,给下一个区间留的空间就越大,所以从左遍历向右,较小的右边界是首选。按照左边界排序需要从右向左遍历,因为左边界的值越大越好(越靠右),所以给上一个区间的空间就越大,所以可以从右到左。如果按照左边界排序,从左到右遍历,也是可以的,逻辑会不一样。可能有的同学在做这道题的时候其实是在模拟重复区间的行为,比较麻烦,不得不把区间删掉。题目只要求删除区间的个数,不需要实际模拟删除区间!我会按右边界排序,从左到右记录不相交区间的个数。最后,用总区间数减去不相交区间数,得到需要去掉的区间数。这时候的问题就是求不相交区间的最大个数。右边界排序后,局部最优:优先选择右边界小的区间,所以从左向右遍历,为下一个区间留出更多空间,尽量避免交叉。全局最优:选择最不相交的区间。局部最优导致全局最优,尝试贪婪!这里记录非相交区间的个数还是有技巧的,如图:非重叠区间,1,2,3,4,5,6都是按照右边界顺序排列的。每取一个不相交的区间,以右边界最小的分割点作为分割点(越多的空间留给下一个区间),所以第一条分割线就是区间1结束的位置。接下来就是找一个大于区间1结束的区间,从区间4开始。那么有同学问为什么不从区间5开始呢?不要忘记它们已经根据正确的边界进行了排序。区间4结束后,找到区间6,所以记录的不相交区间总数为3个。区间总数为6,减去不相交的区间数3。最少要去掉的区间数为3。C++代码如下:classSolution{public://根据区间右边界排序staticboolcmp(constvector
