思路:区间合并和组合数学。
很简单,就是一个区间合并的模板题,我们只需要把区间合并的模板写出来,其实就已经完成一半了。
这道题主要是能够读懂题目就可以了,说的方案数,其实就是将合并完之后的区间分配到两个组里面。按照组合数学的想法,我们可以这样想:每个区间都有两种选择,那么n个区间就有pow(2,n)个方案选择。
注意,在写区间合并的时候,不要忘记首先对于原数组进行排序。
还有,数据范围需要注意,我们有时候需要开long long,而且,在求pow时,最好用快速幂,这样的话才能时间复杂度会好一些。
上代码:
class Solution {
public:
long long fastpow(long long n,long long p,long long mod){
long long res=1;
while(p){
if(p&1)
res=res*n%mod;
n=n*n%mod;
p>>=1;
}
return res%mod;
}
long long countWays(vector<vector<int>>& ranges) {
int n=ranges.size();
vector<vector<int>>haha;
int st=-1e9;
int ed=-1e9;
long long mod=1e9+7;
sort(ranges.begin(),ranges.end());
for(int i=0;i<ranges.size();i++){
if(ranges[i][0]>ed){
if(st!=-1e9){
haha.push_back({st,ed});
}
st=ranges[i][0];
ed=ranges[i][1];
}
else
ed=max(ed,ranges[i][1]);
}
if(st!=-1e9)
haha.push_back({st,ed});
int count=haha.size();
return fastpow(2,count,mod);
}
};