题目

解法
python
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# check empty case
if not intervals:
return []
intervals.sort(key=lambda x:x[0])
# initialize the start ans end for current merging case
start = intervals[0][0]
end = intervals[0][1]
ans = []
for i, interval in enumerate(intervals[1:]):
if interval[0]<=end:
end = max(end,interval[1])
start = min(start,interval[0])
else:
ans.append([start,end])
start = interval[0]
end = interval[1]
ans.append([start,end])
return ans
改进版本,更简洁
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# check empty case
if not intervals:
return []
intervals.sort(key=lambda x:x[0])
# initialize the start ans end for current merging case
ans = [intervals[0]]
for i, interval in enumerate(intervals[1:]):
if interval[0]<=ans[-1][1]:
ans[-1][0] = min(interval[0],ans[-1][0])
ans[-1][1] = max(interval[1],ans[-1][1])
else:
ans.append(interval)
#ans.append([start,end])
return ans
C++版本
sort函数设计lambda在C++中比较tricky,需要记住
class Solution {
public:
static bool cmp(const vector<int>& left, const vector<int>& right){
return left[0]<right[0] || (left[0]==right[0] && left[1]<right[1]);
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.empty() || intervals[0].empty()){
return {};
}
sort(intervals.begin(),intervals.end(),cmp);
int prev_start = intervals[0][0];
int prev_end = intervals[0][1];
vector<vector<int>> output;
for (int i=1;i<intervals.size();i++){
if (prev_end>=intervals[i][0]){
prev_start = min(prev_start,intervals[i][0]);
prev_end = max(prev_end,intervals[i][1]);
}else{
output.push_back({prev_start,prev_end});
prev_start = intervals[i][0];
prev_end = intervals[i][1];
}
}
output.push_back({prev_start,prev_end});
return output;
}
};
这篇博客介绍了LeetCode第56题的解决方案,包括使用Python和C++两种编程语言。文章重点展示了如何通过排序和简化代码来优化解题思路。


被折叠的 条评论
为什么被折叠?



