LeetCode Day45 Merge Intervals 合并区间

解法一:

题目所给区间并非有序,首先要给区间排序,按照每项interval的start值,使用lambda函数定义规则:

[](Interval &a, Interval &b) {return a.start < b.start;}

将start值小定义为小。
排序后将res设为intervals的第一项,从第二项到末尾遍历intervals,若遍历到的当前项和res最后一项有重叠,更新res末项end值,否则将当前项加入res,代码如下:

class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        if (intervals.empty()) return {};
        sort(intervals.begin(), intervals.end(), [](Interval &a, Interval &b){return a.start < b.start;});
        vector<Interval> res{intervals[0]};
        for(int i=1;i<intervals.size();i++){
            if(res.back().end>=intervals[i].start){
                res.back().end=max(res.back().end,intervals[i].end);
            }
            else
                res.push_back(intervals[i]);    
        }
        return res;
    }
};

解法二

下面这种解法将起始位置和结束位置分别存到了两个不同的数组starts和ends中,然后分别进行排序,之后用两个指针i和j,初始化时分别指向starts和ends数组的首位置,然后如果i指向starts数组中的最后一个位置,或者当starts数组上i+1位置上的数字大于ends数组的i位置上的数时,此时说明区间已经不连续了,我们来看题目中的例子,排序后的starts和ends为:
在这里插入图片描述
红色为i的位置,蓝色为j的位置,那么此时starts[i+1]为8,ends[i]为6,8大于6,所以此时不连续了,将区间[starts[j], ends[i]],即 [1, 6] 加入结果res中,然后j赋值为i+1继续循环,参见代码如下:

class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        if (intervals.empty()) return {};
        vector<Interval> res;
        vector<int> starts,ends;
        for(int i=0;i<intervals.size();i++){
            starts.push_back(intervals[i].start);
            ends.push_back(intervals[i].end);
        }
        sort(starts.begin(),starts.end());
        cout<<starts[0];
        sort(ends.begin(),ends.end());
        for(int i=0,j=0;i<intervals.size();i++){
            if(starts[i+1]>ends[i]||i==intervals.size()-1){
                res.push_back(Interval(starts[j],ends[i]));
                j=i+1;}
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/84678862
今日推荐