目录
一、题目
1、题目描述
给你一个二维整数数组
ranges
,其中ranges[i] = [starti, endi]
表示starti
到endi
之间(包括二者)的所有整数都包含在第i
个区间中。你需要将
ranges
分成 两个 组(可以为空),满足:
- 每个区间只属于一个组。
- 两个有 交集 的区间必须在 同一个 组内。
如果两个区间有至少 一个 公共整数,那么这两个区间是 有交集 的。
- 比方说,区间
[1, 3]
和[2, 5]
有交集,因为2
和3
在两个区间中都被包含。请你返回将
ranges
划分成两个组的 总方案数 。由于答案可能很大,将它对109 + 7
取余 后返回。
2、接口描述
cpp
class Solution {
public:
int countWays(vector<vector<int>>& ranges) {
}
};
python3
class Solution:
def countWays(self, ranges: List[List[int]]) -> int:
3、原题链接
二、解题报告
1、思路分析
比较典型的区间合并问题,我们可以通过以区间左端点排序来计算出合并后的不重叠区间的数目
那么答案就转化为了将这些不重叠区间划分为两部分的方案数目
因为题目说了组可以为空,那么假如有cnt个不重叠区间,那么答案就是 2 ^ cnt
2、复杂度
时间复杂度: O(nlogn)空间复杂度:O(logn),来自于快排的递归开销
3、代码详解
cpp
class Solution {
public:
int countWays(vector<vector<int>>& ranges) {
int res = 1, r = -1;
sort(ranges.begin(), ranges.end(), [](const vector<int>& x, const vector<int>& y){
if(x[0] != y[0]) return x[0] < y[0];
return x[1] < y[1];
});
for(auto& p : ranges){
if(p[0] > r)
res = (res << 1) % 1'000'000'007;
r = max(r, p[1]);
}
return res;
}
};
python3
class Solution:
def countWays(self, ranges: List[List[int]]) -> int:
cnt, mr = 0, -1
ranges.sort(key = lambda p : p[0])
for l, r in ranges:
if l > mr:
cnt += 1
mr = max(mr, r)
return pow(2, cnt, 1_000_000_007)