• 【LeetCode】Day104-无重叠区间


    题目

    435. 无重叠区间【中等】

    题解

    动态规划

    动态规划老朋友了!依然不知道咋做啊哈哈哈

    算法:
    先将所有的 n 个区间按照左端点(或者右端点)从小到大进行排序,随后使用动态规划的方法求出区间数量的最大值。

    1. 状态定义:dp[i] 表示以区间 i 为最后一个区间,可以选出的无重叠区间数量的最大值
    2. 状态转移方程dp[i] = max(dp[j])+1,j,第 j 个区间必须要与第 i 个区间不重叠。
    3. 初始条件:dp[i]=1,移除区间的最小数量默认为1
    4. 返回值:n-max(dp[i]),剩下的即为需要移除的最小区间个数
    class Solution {
        public int eraseOverlapIntervals(int[][] intervals) {
            int n=intervals.length;
            Arrays.sort(intervals,new Comparator<int[]>(){
                public int compare(int[] intervals1,int[] intervals2){
                    return intervals1[0]-intervals2[0];
                }
            });
            int[] dp=new int[n];
            Arrays.fill(dp,1);
            for(int i=1;i<n;i++){
            	//遍历前面的区间
                for(int j=0;j<i;j++){
                    //无重叠
                    if(intervals[j][1]<=intervals[i][0])
                        dp[i]=Math.max(dp[i],dp[j]+1);
                }
            }
            return n-Arrays.stream(dp).max().getAsInt();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    时间复杂度: O ( n 2 ) O(n^2) O(n2)

    空间复杂度: O ( n ) O(n) O(n)

    很坑的是,这题动态规划过不了,会超时…还以为是我写的有问题,结果官解也超时…

    贪心

    关于为什么是按照区间右端点排序?
    按照右端点排序,我们一定能够找到一个最先结束的会议,给后面会议预留更长时间,如下图,选a的话只能ad,但如果选b的话可以bcd,移除一个区间即可。

    |_________|                  区间a
      |___|                      区间b       
           |__|                  区间c   
                |______|         区间d   
    
    • 1
    • 2
    • 3
    • 4

    那么本题的贪心策略就是,将区间按照右端点排序,如果当前遍历到的区间 [ l i , r i ] [l_i, r_i] [li,ri]与上一个区间不重合,即 l i ≥ r i g h t l_i ≥right liright,那么我们就可以贪心地选择这个区间,并将 right 更新为 r i r_i ri

    这道题画一个区间图就很好理解了

    class Solution {
        public int eraseOverlapIntervals(int[][] intervals) {
            int n=intervals.length;
            //区间按照右端点排序
            Arrays.sort(intervals,new Comparator<int[]>(){
                public int compare(int[] intervals1,int[] intervals2){
                    return intervals1[1]-intervals2[1];
                }
            });
            int res=1;//剩余的不重叠区间
            int right=intervals[0][1];//当前最右端点位置
            for(int i=1;i<n;i++){
            	//区间不重叠
                if(intervals[i][0]>=right){
                    res++;
                    right=intervals[i][1];//更新最右端点位置
                }
            }
            return n-res;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

    空间复杂度: O ( l o g n ) O(logn) O(logn)

    ↑均为排序所需的复杂度

  • 相关阅读:
    Bytebase 2.11.0 - 支持 OceanBase Oracle 模式
    变焦镜头内参数如何获得?
    5年测试经验公司不肯要,却花高薪请了个3年经验的测试员....
    【Linux】传输层协议:TCP/UDP
    Java的几大常用类
    图片、视频修复并超分 - Real-ESRGAN项目使用(一) | 机器学习
    Java中方法的注意事项
    Ubuntu20.04安装ffmpeg
    接口获取数据,转成JSONOBJECT
    二战MySQL数据库【升华篇】
  • 原文地址:https://blog.csdn.net/qq_43417265/article/details/125990892