leetcode vector+区间合并 56. 合并区间+57. 插入区间

56. 合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]

解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]

解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

解题
贪心算法
将给定数组按第一个数排序,
关键点
创建一个新数组,与给定数组比较,若区间左端在区间内,取右端大的。
熟悉vector的用法,!vector.size()可以判断vector是否为空;vector.back()可得到vector最后的元素;

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.size()==0){
            return {};
        }

        sort(intervals.begin(), intervals.end());
        //按first排序

        //新建一个二维数组,保存结果
        vector<vector<int>> result;

        for(int i=0;i<intervals.size();i++)
        {
            int L=intervals[i][0], R = intervals[i][1];
            if(!result.size()||result.back()[1]<intervals[i][0])
                result.push_back(intervals[i]);
            else result.back()[1]=max(intervals[i][1],result.back()[1]);
        }
        return result;
    }
};

57. 插入区间

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

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

示例 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] 重叠。

解题:复杂度NlogN
把newinterval先放入interval中,然后按第一个数排序;
后面与合并区间相同做法即可;

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> result;

        intervals.push_back(newInterval);
        sort(intervals.begin(),intervals.end());

        for(int i=0;i<intervals.size();i++)
        {
            if(!result.size()||intervals[i][0]>result.back()[1])
                result.push_back(intervals[i]);
            else result.back()[1]=max(result.back()[1],intervals[i][1]);

        }
        return result;
    }
};

解题2:复杂度N
因为给定数组已排序,则左值小于newinterval的先放入结果vector中;
当左值不小于newinterval时,合并newinterval到结果数组中;
再合并后续区间即可;

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> result;        

        int i;
        for(i=0;i<intervals.size();i++)
        {
            if(intervals[i][0]<newInterval[0])
                result.push_back(intervals[i]);
            else break;
        }    
            
        if(!result.size()||newInterval[0]>result.back()[1])
            result.push_back(newInterval);
        else result.back()[1]=max(result.back()[1],newInterval[1]);

        for(;i<intervals.size();i++)
        {
            if(!result.size()||intervals[i][0]>result.back()[1])
            result.push_back(intervals[i]);
            else result.back()[1]=max(result.back()[1],intervals[i][1]);
        }
        return result;
    }
};

题目链接:57. 插入区间

你可能感兴趣的:(贪心算法,算法,leetcode)