zoukankan      html  css  js  c++  java
  • LeetCode 435. 无重叠区间 做题小结

    题目

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
    
    注意:
    
    可以认为区间的终点总是大于它的起点。
    区间 [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,所以一共记录非交叉区间的个数是三个。

    总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。

    代码

        pub
        lic static int eraseOverlapIntervals(int[][] intervals) {
        	if(intervals.length==0) {
        		return 0;
        	}
        	// 按照区间右边界排序
        	Arrays.sort(intervals, new Comparator<int[]>() {
    
    			@Override
    			public int compare(int[] o1, int[] o2) {
    				if(o1[1]>o2[1]) {
    					return 1;
    				}else if(o1[1]<o2[1]) {
    					return -1;
    				}
    				return 0;
    			}
        		
    		});
        	int count=1;// 记录非交叉区间的个数
        	int end=intervals[0][1];// 记录区间分割点
        	for (int i = 0; i < intervals.length-1; i++) {
    			if(intervals[i+1][0]>=end) {
    				end=intervals[i+1][1];
    				count++;
    			}
    		}
        	return intervals.length-count;
        }
    

    参考:https://mp.weixin.qq.com/s/oFOEoW-13Bm4mik-aqAOmw

  • 相关阅读:
    metal的gpu query
    体积雾 global fog unity 及改进
    hdr rt format对颜色的影响
    unity deferred lighting
    unity linear space时 photoshop blend的正确设置
    unity linear work flow
    一些数据 bandwidth之类
    deferred rendering with msaa
    unity 显示mipmaplevel
    【转】在C#中使用SendMessage
  • 原文地址:https://www.cnblogs.com/nmydt/p/14256347.html
Copyright © 2011-2022 走看看