LeetCode_Array_56. Merge Intervals (C++)

目录

1,题目描述

2,解题思路

3,代码【C++】

4,运行比较


1,题目描述

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].


Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

2,解题思路

我的思路

  • 先排序
  • 设置left,right,将排序后的一系列连续区间合并后(大致分为四种情况:[1,3]与[1,2]、[1,3]与[2,3]、[1,3]与[2,4]、[1,3]与[4,5]),更新left与right;
  • 若出现断层,将{left,right}加入ans数组中,并更新left与right(若最后一组出现断层,则需单独判断);

大神的思路

  • 先排序;
  • 设置index,并将intervals首个区间加入ans中;
  • 判断时先判断是否连通,再细分不同情况;
  • 更新时,只需更新当前index的第二个元素即可;

3,代码【C++】

我的代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans;
        if(intervals.empty() == true) return ans;//input 为空

        sort(intervals.begin(), intervals.end());//默认递增排序
        int left = intervals[0][0];
        int right = intervals[0][1];

        for(int i = 0 ; i < intervals.size() ; i++){
            if(left == intervals[i][0]){
                if(right < intervals[i][1]) {right = intervals[i][1];}//[1,3],[1,4]
            }
            else{
                if(right < intervals[i][0]) {
                    ans.push_back({left,right});
                    left = intervals[i][0];
                    right = intervals[i][1];
                    
                }//[1,3],[4,5]

                else if(right < intervals[i][1]) {right = intervals[i][1];}//[1,3],[2,4]
            }
            if(i == intervals.size() - 1) ans.push_back({left, right});
        }
        return ans;
    }
};

大神的代码

class Solution {
public:
    //排序 
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;  //声明res
        if(intervals.empty()) return res;  //判断边界

        sort(intervals.begin(),intervals.end()); //将区间的左边界进行排序
        int index = 0;  //res的遍历索引
        res.push_back(intervals[0]);    //先将intervals的第一个区间放到res里面
        for (int i = 1; i < intervals.size(); i++)  //遍历intervals的其他区间
        {
            if(res[index][1] >= intervals[i][0]) //res从index开始,由于intervals已经排序,如果满足res[index]的右区间 大于 
            {                                    //intervals[i]的左区间,表明这两个区间有交集
                if(res[index][1] < intervals[i][1]) //除此之外,还要判断res[index]的右区间 与 intervals[i]的右区间的关系,
                {                                   //如果res[index]的右区间 小于 intervals[i]的右区间,则取代,反之不变。
                    res[index][1] = intervals[i][1];  //例如 [[1,4] ,[2,3]] -> [[1,4]]
                }
            }
            else
            {
                index++;  //如果不满足有联通区域,直接将index++,并将当前的intervals[i] 放到res里面,进行下一时刻的合并
                res.push_back(intervals[i]);
            }
        }
        return res;
    }
};

 

 

4,运行比较

我的代码

大神的代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值