给你一个二维整数数组
ranges
,其中ranges[i] = [starti, endi]
表示starti
到endi
之间(包括二者)的所有整数都包含在第i
个区间中。你需要将
ranges
分成 两个 组(可以为空),满足:
- 每个区间只属于一个组。
- 两个有 交集 的区间必须在 同一个 组内。
如果两个区间有至少 一个 公共整数,那么这两个区间是 有交集 的。
- 比方说,区间
[1, 3]
和[2, 5]
有交集,因为2
和3
在两个区间中都被包含。请你返回将
ranges
划分成两个组的 总方案数 。由于答案可能很大,将它对109 + 7
取余 后返回。输入:ranges = [[6,10],[5,15]] 输出:2 解释: 两个区间有交集,所以它们必须在同一个组内。 所以有两种方案: - 将两个区间都放在第 1 个组中。 - 将两个区间都放在第 2 个组中。
首先初始化m = 0; maxR = -1。 把区间按照左端点从小到大排序,遍历区间,同时维护当前合并的最大区间右端点maxR
- 如果当前区间的左端点l大于maxR,由于我们已经按照左端点排序了,那么后面任何区间都不会和之前的区间有交集,换句话说,产生了一个新的大区间,把m+1,同时maxR = 当前区间右端点r。
- 否则,当前区间要合并到大区间内,用当前区间右端点r更新maxR的最大值。
class Solution:def countWays(self, ranges: List[List[int]]) -> int:ranges.sort(key = lambda p: p[0])m, max_r = 0, -1for l, r in ranges:if l > max_r:m += 1max_r = max(max_r, r)return pow(2,m,1_000_000_007)