zoukankan      html  css  js  c++  java
  • 力扣每日一题:插入区间(困难)

    给出一个无重叠的 ,按照区间起始端点排序的区间列表。

    在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

    示例 1:

    输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
    输出:[[1,5],[6,9]]
    示例 2:

    输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
    输出:[[1,2],[3,10],[12,16]]
    解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

    说是困难难度的题,其实考察的知识点就两个:区间合并 + 贪心。
    AC代码:

    class Solution {
    public:
        vector<vector<int> > insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
            #define INF -2e9 //定义一个最小值
            vector<vector<int> > res; 
            typedef pair<int,int>  PII; 
            vector<PII> ans , a; 
            for(auto it : intervals) a.push_back({it[0],it[1]});//用pair来存取每个区间,first存左端点,second存右端点。保证插入新数组后可以对其按区间起始端点排序。
            a.push_back({newInterval[0],newInterval[1]}); //插入新区间
            sort(a.begin() , a.end()); //按区间左端点值由小到大排序
    
            int st = INF , ed = INF; //当前维护区间的左右端点
            for(vector<PII>::iterator it = a.begin() ; it != a.end() ; it ++){
                if(ed < it->first){
                    if(st != INF) ans.push_back({st , ed}); //如果不是初始区间,则加进去
                    st = it->first;
                    ed = it->second;
                }
                else if(ed >= it->first){
                    if(st != INF) ed = max(ed , it->second);
                }
            }
            if(st != INF) ans.push_back({st , ed}); //判断是防止输入是空的情况,把最后一个区间也加进去
            
            for(vector<PII>::iterator it = ans.begin() ; it != ans.end() ; it ++) 
                res.push_back({it->first,it->second});
            return res;
        }
    };
    

    用auto迭代简化代码后:

    class Solution {
    public:
        vector<vector<int> > insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
            #define INF -2e9 //定义一个最小值
            vector<vector<int> > res; 
            typedef pair<int,int>  PII; 
            vector<PII> ans , a; 
            for(auto it : intervals) a.push_back({it[0],it[1]});//用pair来存取每个区间,first存左端点,second存右端点。保证插入新数组后可以对其按区间起始端点排序。
            a.push_back({newInterval[0],newInterval[1]}); //插入新区间
            sort(a.begin() , a.end()); //按区间左端点值由小到大排序
    
            int st = INF , ed = INF; //当前维护区间的左右端点
            for(auto it : a){
                if(ed < it.first){
                    if(st != INF) ans.push_back({st , ed}); //如果不是初始区间,则加进去
                    st = it.first;
                    ed = it.second;
                }
                else if(ed >= it.first){
                    if(st != INF) ed = max(ed , it.second);
                }
            }
            if(st != INF) ans.push_back({st , ed}); //判断是防止输入是空的情况,把最后一个区间也加进去
            
            for(auto it : ans) 
                res.push_back({it.first,it.second});
            return res;
        }
    };
    
  • 相关阅读:
    mock中测试private方法,不是mock
    PHP检测每一段代码执行时间
    Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.
    php返回HTTP状态码
    PHP获取今天、昨天、明天的日期
    memcache及其telnet命令使用详解
    PHP的json_encode中文被转码的问题
    PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
    php pack()函数详解与示例
    socket编程原理
  • 原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/13926931.html
Copyright © 2011-2022 走看看