leetcode 2580.统计将重叠区间合并成组的方案数

时间:2024-03-31 18:01:52

思路:区间合并和组合数学。

很简单,就是一个区间合并的模板题,我们只需要把区间合并的模板写出来,其实就已经完成一半了。

这道题主要是能够读懂题目就可以了,说的方案数,其实就是将合并完之后的区间分配到两个组里面。按照组合数学的想法,我们可以这样想:每个区间都有两种选择,那么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);
    }
};