LeetCode每日一题(中等)2580. 统计将重叠区间合并成组的方案数

此题思路较为简单,其根本就是在于找到不相交的集合数量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;
    }
};

通过本题,我们应该学会逆向思维,有时候正着想比较复杂,不妨反着思考一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值