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

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

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

示例 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;
    }
};
原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/13926931.html