• 重叠子区间问题


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

    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题,加油加油。

  • 相关阅读:
    VS2017 C# winform 项目使用 sqlite (二)
    VS2017 C# winform 项目使用 sqlite (一)
    JS权威指南笔记(171页)-this关键字的作用域
    量化交易之下单函数和context对象
    量化交易策略基本框架
    初始量化交易
    金融量化之Tushare模块
    Python之基础算法介绍
    数据分析之Matplotlib和机器学习基础
    数据分析之Pandas
  • 原文地址:https://www.cnblogs.com/doris233/p/13946932.html
Copyright © 2020-2023  润新知