当前位置: 首页 > 科技观察

为了得到不重叠区间,煞费苦心

时间:2023-03-21 16:22:40 科技观察

不重叠区间链接链接: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&a,constvector&b){returna[1]>&intervals){if(intervals.size()==0)return0;sort(intervals.begin(),intervals.end(),cmp);intcount=1;//记录不交叉区间的个数intend=intervals[0][1];//记录区间划分点for(inti=1;i&a,constvector&b){returna[1]>&intervals){if(intervals.size()==0)return0;sort(intervals.begin(),intervals.end(),cmp);intresult=1;//points不为空至少需要一个箭头(inti=1;i=intervals[i-1][1]){result++;//需要箭头}else{//ballooniandballooni-1nexttointervals[i][1]=min(intervals[i-1][1],intervals[i][1]);//更新重叠气球的最小右边界}}returnintervals.size()-result;}};这里按照左区间遍历或者按照右边界遍历都可以是AC。具体原因我还没看,以后有时间再补充。classSolution{public://按照区间左边界排序staticboolcmp(constvector&a,constvector&b){returna[0]>&intervals){if(intervals.size()==0)return0;sort(intervals.begin(),intervals.end(),cmp);intresult=1;//points不为空至少需要一个箭头(inti=1;i=intervals[i-1][1]){result++;//需要箭头}else{//ballooniandballooni-1nexttointervals[i][1]=min(intervals[i-1][1],intervals[i][1]);//更新重叠气球的最小右边界}}returnintervals.size()-结果;}};本文转载自微信公众号“码随机记录”,可通过以下二维码关注。转载本文请联系CodeCaprice公众号。