自学内容网 自学内容网

力扣56.合并区间

题目描述

题目链接56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

思路解析

        先将数组根据每个元素的起始点进行排序,然后我们只需要比较后一个元素的起始点与前一个元素的终点大小,如果大于的话说明没有重复区间,反之有重复区间,此时将前一个元素与后一个元素进行合并,注意还需要判断前一个元素的终点与后一个元素的终点大小,如果大于的话还需要修改后一个元素的终点,否则会丢失前一个元素的一部分区间。

        当没有重复区间的时候就可以将前一个数组放入答案数组中,这样做会少放最后一个区间,所以在遍历完数组后要再将最后一个区间放入答案数组中。

        注意:如果将比较器在类中定义的话,要将比较器设置为静态成员函数。还可以将比较器用lambda表达式实现。

代码实现

bool cmp(vector<int>A,vector<int>B){
        return A[0]<B[0];
}
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& vec) {
        vector<vector<int>> ans;
        sort(vec.begin(),vec.end(),cmp);//用每个元素的起始点从小到大排序
        for(int i=1;i<vec.size();i++){//遍历数组
            if(vec[i][0]<=vec[i-1][1]){//如果该数组开始值比前一个数组结束值小,则有重复区间
                vec[i][0]=vec[i-1][0];//将该数组与前一个数组合并,前一个数组不需要再管了
                if(vec[i][1]<vec[i-1][1])vec[i][1]=vec[i-1][1];
            }
            else ans.push_back(vec[i-1]);//当没有重复区间把前一个数组放入答案数组中
        }
        ans.push_back(vec[vec.size()-1]);//把最后一个区间放入答案数组
        return ans;
    }
};


原文地址:https://blog.csdn.net/2301_80505422/article/details/144356411

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!