# Sum of Intervals
# https://www.codewars.com/kata/52b7ed099cdc285c300001cd/train/python
def sum_of_intervals(intervals):
intervals.sort(key = lambda x:x[0])
result = 0
previous = intervals[0]
for l,r in intervals[1:]:
if l <=previous[1]:
previous = [previous[0],max(r,previous[1])]
else:
result += previous[1]-previous[0]
previous = [l,r]
return result + previous[1]-previous[0]
# best practice in codewars
def sum_of_intervals_2(intervals):
s,top = 0,float('-inf')
for a,b in sorted(intervals):
if top<a: top = a
if top<b: s,top = s+(b-top),b
return s
# def sum_of_intervals(intervals):
# distinct_intervals = [intervals[0]]
# for l,r in intervals[1:]:
# index = 0
# is_merged = False
# while index <len(distinct_intervals):
# if l <=distinct_intervals[index][1] and r >= distinct_intervals[index][0]:
# is_merged = True
# distinct_intervals[index] = (min(l,distinct_intervals[index][0]),max(r,distinct_intervals[index][1]))
# break
# elif r < distinct_intervals[index][0]:
# distinct_intervals.insert(index,(l,r))
# break
# elif l > distinct_intervals[index][1]:
# if index == len(distinct_intervals)-1:
# distinct_intervals.append((l,r))
# break
# index+=1
# break
# if is_merged:
# end = index+1
# # keep distinct_intervals[end][0] > r or end == len(distinct_intervals)
# while end < len(distinct_intervals) and r >=distinct_intervals[end][0]:
# end+=1
# distinct_intervals[index:end] = [(min(l,distinct_intervals[index][0]),max(r,distinct_intervals[end-1][1]))]
# #被替换的部分不包括end
# '''
# a = [1,2,3,4,5,6,7,8,9]
# a[2:5]=[0]
# print(a)#[1, 2, 0, 6, 7, 8, 9]
# '''
# return sum([r-l for l,r in distinct_intervals],0)
# #列表推导式,
# print(sum_of_intervals(
# [
# [0, 20],
# [-100000000, 10],
# [30, 40]
# ] ))