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

  • 相关阅读:
    vue-vue-cli3配置文件的查看和修改
    vue-vue-cli3初始化项目
    vue-vue构建版本runtime-compiler和runtime-only的区别
    vue-vue构建版本runtime-compiler和runtime-only的区别
    vue-vue-cli2目录结构介绍
    Redis设计与实现(十一)事件
    Redis设计与实现(十)AOF持久化
    Redis设计与实现(九)RDB持久化
    Redis设计与实现(八)数据库
    Redis设计与实现(七)对象
  • 原文地址:https://www.cnblogs.com/doris233/p/13946932.html
Copyright © 2011-2022 走看看