此题思路较为简单,其根本就是在于找到不相交的集合数量n,再求2^n次方即可。
但如果直接找不相交的集合较为困难,可把给出的容器先进行排序,再查看下一个范围是否和上一个范围重合,若重合,则将范围变为两个范围的并集,若不重合,得到的ans自加1,范围也跟着变化。
但上述方法还是较为复杂,找两个有交集的集合比较困难,但找两个不相交的集合更为简单,仅仅只需要下一个集合的最小值大于前一个集合的最大值即可。若满足,则将范围刷新,得到的结果数乘2即可,代码如下所示:
class Solution {
public:
int countWays(vector<vector<int>>& ranges) {
vector<int> min;
vector<int> max;
int p;
int mod = 1e9 + 7;
sort(ranges.begin(),ranges.end());
int ans = 1, l = -1, r = -1;
for(int i = 0; i<ranges.size(); i++)
{
if(ranges[i][0] > r){ //范围不与前一个范围重合
ans = ans * 2 % mod;
l = ranges[i][0];
r = ranges[i][1];
}
else{
p = ranges[i][1];
if(p > r) r = p;
}
}
return ans;
}
};
通过本题,我们应该学会逆向思维,有时候正着想比较复杂,不妨反着思考一下