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 = send = eres.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 0count = 0intervals = 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+=1else:end = ereturn 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-=1else:end = ereturn 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 0events = list(zip(*intervals))events = [(x,1) for x in events[0]] + [(x,-1) for x in events[1]]events.sort()cur = 0ans = 0for _, e in events:cur+=eans = max(cur,ans)return ans
