zoukankan      html  css  js  c++  java
  • 重叠子区间问题

    新的一天,新的刷题记录。

    leetcode 435 无重叠区间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

    注意:

    可以认为区间的终点总是大于它的起点。
    区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

    示例:

    输入: [ [1,2], [2,3], [3,4], [1,3] ]
    
    输出: 1
    
    解释: 移除 [1,3] 后,剩下的区间没有重叠。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/non-overlapping-intervals
    思想:我们对这些区间,按右边进行一个升序排序。

    1 2    
      2 3  
    1   3  
        3 4

    那么排序之后的第一个元素的右边是最小的,我们跟剩下的进行对比,如果下一个区间的左边小于前一个的右边那么就有重叠区间,否则就令右边等于当前区间的右边。

    代码分析如下:

     1 //假设区间数组为temp
     2 int n=temp.size();
     3 sort(temp.begin(),temp.end(),cmp);
     4 int x_start=temp[0][1];
     5 for(int i=1;i<n;i++){
     6     if(temp[i][0]<x_start){
     7             count++;//有重叠子区间
     8     }else{
     9             x_start=temp[i][1];
    10     }

    具体实现入下:

     1 class Solution {
     2 public:
     3     static bool cmp(vector<int>&a,vector<int>&b){
     4         return a[1]<b[1];
     5     }
     6     int eraseOverlapIntervals(vector<vector<int>>& intervals) {
     7         int n=intervals.size();
     8         if(n==0||n==1)
     9             return 0;
    10         sort(intervals.begin(),intervals.end(),cmp);
    11         int count=0;
    12         int x_end=intervals[0][1];
    13         for(int i=1;i<n;i++){
    14             int start=intervals[i][0];
    15             if(start>=x_end){
    16                 x_end=intervals[i][1];
    17             }else{
    18                 count++;
    19             }
    20         }
    21         return count;
    22     }
    23 };

    类似,也做了452题,加油加油。

  • 相关阅读:
    【转】i18n实现前端国际化(实例)
    【转】SQL Pretty Printer for SSMS 很不错的SQL格式化插件
    windows server IIS启用Windows authentication
    【转】命令行下载各种网上各种视频
    解决python “No module named pip”
    【转】excel音标乱码
    【转】自动化部署之jenkins及简介
    【转】右键菜单管理
    【转】C# @作用
    【转】NGen
  • 原文地址:https://www.cnblogs.com/doris233/p/13946932.html
Copyright © 2011-2022 走看看