leetcode56-合并区间(c++/python)

Posted depth-perception

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode56-合并区间(c++/python)相关的知识,希望对你有一定的参考价值。

题目

技术图片

思路

接近区间问题,一般是先排序,然后在观察规律

一个区间可以用[start,end]来表示,基于start对整个数组进行排序。

  • 如果相邻的两个区间a和b存在a.end小于b.start的情况,则两区间无交集。

  • 否则,有交集。对于区间a和b产生的合并区间p,p.start一定是这两区间中start最小的,p.end一定是这两区间中end最大的。由于已经排好序了,p.start一定是a.start,那么对于p.end,可以找这两区间中end最大的。

题解

C++:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.empty()) return {};
        sort(intervals.begin(),intervals.end(),[&, this](vector<int> &v1, vector<int> &v2) { return v1[0] < v2[0];}); //基于start排序
        vector<vector<int>> ans;
        ans.push_back(intervals[0]);
        for(int i=1;i<intervals.size();i++)
        {  //如果这里定义临时变量表示intervals[i]或者ans.back(),要注意对临时变量的操作,在原数组上不一定有效
           if(intervals[i].front()<=ans.back().back())
           {
               ans.back().back()=max(ans.back().back(),intervals[i].back());
           } else{
               ans.push_back(intervals[i]);
           }
        }
        return ans;
    }
};

Python:

class Solution(object):
    def merge(self, intervals):
        if not intervals:
            return []
        intervals.sort(key=lambda x:x[0])
        ans=[]
        ans.append(intervals[0])
        for i in range(1,len(intervals)):
            if(intervals[i][0]<=ans[-1][1]):
               ans[-1][1]=max(ans[-1][1],intervals[i][1])
            else:
                ans.append(intervals[i])
                
        return ans

参考

1.https://leetcode-cn.com/problems/merge-intervals/

2.微信公众号:labuladong

以上是关于leetcode56-合并区间(c++/python)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 56. 合并区间

leetcode56 合并区间

力扣leetcode 56. 合并区间

leetcode| 56. 合并区间

Leetcode 56. 合并区间

LeetCode56:合并区间