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

    题目描述

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

    注意:

    1. 可以认为区间的终点总是大于它的起点。
    2. 区间 [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
    
    解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/non-overlapping-intervals

    思路解析

    1. 将所有的区间按找开始端点从小到大排序。
    2. 新建一个栈,依次向栈内压入区间。
    3. 压栈过程中与栈顶比较,若栈顶区间与待入栈区间无重叠,则直接入栈,否则需要比较待入栈区间和栈顶区间的右端点,更新栈顶区间为右端点较小的那一个。
    4. 最终返回栈元素个数与输入元素个数之差。
    • 因为所有的区间已经按照起点从小到达排序,则相邻两个区间 inv1inv2 之间只可能存在以下三种情况:
      * inv2[0] > inv1[1]
      * inv2[0] < inv1[1] && inv2[1] > inv1[1]
      * inv2[0] < inv1[1] && inv2[1] < inv1[1]

    代码实现

    class Solution {
    public:
        int eraseOverlapIntervals(vector<vector<int>>& intervals) {
            sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b){ return a[0] < b[0]; });
            stack<vector<int>> stkIntv;
            for(auto intv : intervals) {
                if(stkIntv.empty() || intv[0] >= stkIntv.top()[1]) {
                    stkIntv.push(intv);
                }
                else if(intv[1] < stkIntv.top()[1]) {
                    stkIntv.pop();
                    stkIntv.push(intv);
                }
            }
            return intervals.size() - stkIntv.size();
        }
    };
    
  • 相关阅读:
    数据库中Schema(模式)概念的理解
    debug --- 使用Eclipse
    pgsql 相关函数
    浏览器显示页面排版错误
    jqury 属性
    节点互换需要克隆
    mysql数据库允许远程访问
    request与response的编码和解码
    文本和属性 radio,checkbox,select
    js 和 JQuery 获取iframe的父子值
  • 原文地址:https://www.cnblogs.com/xqmeng/p/14215345.html
Copyright © 2011-2022 走看看