56. 合并区间
https://leetcode-cn.com/problems/merge-intervals/
其实是找互相没有交叉的区间
- 根据区间处理的情况判断以区间起始点排序还是终止点
此类循环注意结束后还需要再将最后状态放入结果Array中
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
if not intervals:
return []
intervals = sorted(intervals, key=lambda a: a[0])
start = intervals[0][0]
end = intervals[0][1]
res = []
for s,e in intervals[1:]:
if s <= end:
start = min(s, start)
end = max(e, end)
else:
res.append([start,end])
start = s
end = e
res.append([start,end])
return res
57. 插入区间 Hard
https://leetcode-cn.com/problems/insert-interval/
435. 无重叠区间
https://leetcode-cn.com/problems/non-overlapping-intervals/
本题是不要重叠的区间,所以可以和下面一题对比, 下面是要求最小可重叠的区间,关键的两个区别:用左边界还是右边界排序
- 边界交叉的条件 (< or <=)
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
if len(intervals) < 2:
return 0
count = 0
intervals = sorted(intervals, key = lambda a:a[1])
start = intervals[0][0]
end = intervals[0][1]
for s,e in intervals[1:]:
if s < end:
count+=1
else:
end = e
return count
452. 用最少数量的箭引爆气球
https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/
这道题关键是用左边界排序, 当后一个区间左边界触及前一个区间的右边界时,压缩区间,取两个区间overlap的部分
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points) < 2:
return len(points)
points = sorted(points, key = lambda a:a[0])
arrows = len(points)
end = points[0][1]
for s,e in points[1:]:
if s <= end:
end = min(end,e)
arrows-=1
else:
end = e
return arrows
253. 会议室 II
https://leetcode-cn.com/problems/meeting-rooms-ii/
题目就是要统计同一时刻进行的最大会议的数量
我们可以把所有的开始时间和结束时间放在一起排序,
用cur表示当前进行的会议数量,遍历排序后的时间数组
如果是开始时间,cur加1,如果是结束时间,cur减一
在遍历的过程中,cur出现的最大值就是需要的房间数
如果一个会议结束的时候和一个会议开始的时间相同,主要要让一个先结束,一个再开始
class Solution:
def minMeetingRooms(self, intervals: List[List[int]]) -> int:
if not intervals:
return 0
events = list(zip(*intervals))
events = [(x,1) for x in events[0]] + [(x,-1) for x in events[1]]
events.sort()
cur = 0
ans = 0
for _, e in events:
cur+=e
ans = max(cur,ans)
return ans