leetcode专题训练 56. Merge Intervals

这道题直接模拟就好了。先将两个区间按照左值排序,这时如果两个区间能连起来的话,那么就说明第二个区间的左值一定要大于等于第一个区间的右值。根据这个思想,就可以开始做题了。先将intervals按照左值排序,之后遍历数组。如果当前区间左值小于上一个区间的右值,就说明连不起来,那这时候就把上一个区间加入result即可;如果当前区间左值大于等于上一个区间右值,那么就能连起来,这时候要考虑当前区间的右值是否大于上一个区间,如果大于上一个区间,那么就将上一个区间的右值扩大到当前区间右值,否则上个区间右值不变。
WA的一次是忘了将sorted之后的返回值赋值给Intervals了。一定要记住这里的Intervals=。而且这里还学到了如何根据list中的特定列排序,调用operator中的itemgetter即可。Mark。

from operator import itemgetter, attrgetter

intervals = sorted(intervals, key=itemgetter(0))

代码整体如下:

from operator import itemgetter, attrgetter

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        if not intervals:
            return []
        
        intervals = sorted(intervals, key=itemgetter(0)) #按照第一个元素排序
        #print(intervals)
        result = []
        left = right = intervals[0][0] #将第一个结果区间的左右界初始化
        for index, value in enumerate(intervals):
            if value[0] > right: #当前扫到的区间没有与之前区间重叠,就把之前的区间加入result,同时更新新区间的左右界
                result.append([left, right])
                left = value[0]
                right = value[1]
            else:
                if value[1] > right:
                    right = value[1]
        result.append([left, right]) #将最后一个区间加入
        return result
发布了201 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Ema1997/article/details/101629741