• 力扣每日一题:插入区间(困难)


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

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

    示例 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;
        }
    };
    
  • 相关阅读:
    仿QQ信息弹出
    天高云淡 leobbs皮肤
    http://www.xywq.com/files/ganzhi11.htm
    用Silverlight打造位运算器(3)--完成
    用Silverlight打造位运算器(1)--制作简易工具条控件
    用Silverlight打造位运算器(2)--制作数字文本框控件
    Lucky Sequence[SRM403DIVI500]
    答复:“判断一个整数的二进制位中有多少个1”的提问
    Python 笔记(1)
    #define中的#、## && #@
  • 原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/13926931.html
Copyright © 2020-2023  润新知