Day1——56.LeetCode 合并区间(贪心算法)

1.写在前面

  OK本人博客用于记录自己恶补编程能力的过程,为了增加过程的获得感以及使刷题记忆更加深刻因此选择记录下来(大概类似于随记也不会很美观具体,但会有主播的思考过程)。或许主播的表述方式能够对一些人有帮助。。。

2.题目解答

  OK废话不多说题目见连接LeetCode56。大概意思就是数组元素是一些区间,将相交的区间进行合并,最终输出结果。
  首先下意识的发现我们需要对区间进行排序,因为需要对不同区间的首尾进行比较。一个简单的想法就是根据每个区间的左区间进行不减排序。这里直接使用sort(start_pointer,end_pointer,cmp)函数。(意思大概是两个指针之间的所有对象根据比较规则cmp进行排序)
  接下来就是本题的核心:如何进行合并。这里使用贪心算法进行合并。由于区间之间已经有序,所以只需要考虑当前区间能否与前一个区间进行合并。也就是判断当前区间 [ a , b ] [a,b] [a,b]的左边界 a a a与前一个区间 [ c , d ] [c,d] [c,d]的右边界 d d d的关系,若 a ≤ d a \leq d ad则合并,否则不合并。
  若当前区间可以与上一个区间合并,则继续看下一个区间能否继续合并,依次循环下去。要注意合并后区间的右边界是所有合并的子区间的有边界的最大值,即 [ 1 , 8 ] , [ 2 , 6 ] , [ 3 , 7 ] [1,8],[2,6],[3,7] [1,8],[2,6],[3,7]合并完是 [ 1 , 8 ] [1,8] [1,8]
  此外还需注意,因为我们是当前区间向前一个区间进行合并,因此再处理最后一个区间时,若其没进行合并,需要单独将其加入结果中。
  完整代码及注释如下:

bool cmp(vector<int>& a,vector<int>& b){
        return a[0]<b[0];
}
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        //根据边界排序
        sort(intervals.begin(),intervals.end(),cmp);
        vector<vector<int>> ans;
        //一个区间不需要合并
        if(intervals.size()==1) return intervals;
        for(int i=1;i<intervals.size();i++){
            //前一个区间的左右边界
            int start=intervals[i-1][0];
            int end=intervals[i-1][1];
            //当前区间和前一个区间有交集则合并,然后看下一个区间是否还有交集,依次类推
            //合并区间的右边界是所有合并的子区间的右边界的最大值
            while(i<intervals.size()&&intervals[i][0]<=end){
                end=max(end,intervals[i][1]);
                i++;
            }
            //单独判断最后一个子区间是否合并,未合并则手动将其加入结果
            //合并了则已经加入结果,不需要别的处理
            if(i==intervals.size()-1&&intervals[i][0]>intervals[i-1][1]){
                ans.push_back({intervals[i][0],intervals[i][1]});
            }
            ans.push_back({start,end});
        }
        return ans;
    }
};

3.复杂度分析

  时间开销主要为排序和边界的比较,排序时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn),比较的时间复杂度为 O ( n ) O(n) O(n)因此总的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)
  空间开销主要为 ans \text{ans} ans数组,为 O ( n ) O(n) O(n)。或许有就地合并的写法。不管了先过了再说。

4.写在后面

  因为主要是为了记录自己的刷题过程,也不知道有多少人可以刷到,为了节省记录时间主要以文字描述的形式进行,有疑问的同学可以评论区讨论,同时也希望有大佬能分享更多解法或者好题、学习方法等等。共勉。

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