码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-03-14 21:50:26      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:int   key   self   mic   leetcode   dong   注意   src   tar   

题目

技术图片

思路

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

一个区间可以用[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)

标签:int   key   self   mic   leetcode   dong   注意   src   tar   

原文地址:https://www.cnblogs.com/depth-perception/p/12494323.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!