合并区间
第一步应该想到要按区间的第一个元素进行排序,然后若后一个区间的起始元素小于前一个区间的结尾元素,判断一下两个区间的结尾元素孰大孰小,选择大的作为新区间的结尾元素。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key = lambda x: x[0])
merged = []
for interval in intervals:
if not merged or merged[-1][1] < interval[0]:
merged.append(interval)
else:
merged[-1][1] = max(merged[-1][1], interval[1])
return merged
插入区间
和合并区间一样,先把插入的区间加入,后面在sort和合并区间套路一样。
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
res = []
intervals.append(newInterval)
intervals.sort(key = lambda x:x[0])
for interval in intervals:
if not res or res[-1][1] < interval[0]:
res.append(interval)
else:
res[-1][1] = max(res[-1][1], interval[1])
return res
汇总区间
class Solution:
def summaryRanges(self, nums: List[int]) -> List[str]:
def f(i:int,j:int)->str:
return str(nums[i]) if i==j else f'{nums[i]}->{nums[j]}'
i = 0
n = len(nums)
ans = []
while i < n:
# for i in range(n-1):
j = i
while j + 1 < n and nums[j+1] == nums[j]+1:
j += 1
ans.append(f(i,j))
i = j+1
return ans
射出最少的箭
相比较合并区间是合并取最大,那么射箭就是合并取最小。并集改为交集,左区间找最大,右区间找最小。
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
points.sort(key = lambda x : x[0])
merged = []
for point in points:
if not merged or merged[-1][1] < point[0]:
merged.append(point)
else:
merged[-1][0] = max(merged[-1][0], point[0])
merged[-1][1] = min(merged[-1][1], point[1])
y = len(merged)
return y