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)的主要内容,如果未能解决你的问题,请参考以下文章