这道题直接模拟就好了。先将两个区间按照左值排序,这时如果两个区间能连起来的话,那么就说明第二个区间的左值一定要大于等于第一个区间的右值。根据这个思想,就可以开始做题了。先将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