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

93 阅读1分钟

题目:
给你一个二维整数数组 ranges ,其中 ranges[i] = [starti, endi] 表示 starti 到 endi 之间(包括二者)的所有整数都包含在第 i 个区间中。

你需要将 ranges 分成 两个 组(可以为空),满足:

  • 每个区间只属于一个组。
  • 两个有 交集 的区间必须在 同一个 组内。

如果两个区间有至少 一个 公共整数,那么这两个区间是 有交集 的。

  • 比方说,区间 [1, 3] 和 [2, 5] 有交集,因为 2 和 3 在两个区间中都被包含。

请你返回将 ranges 划分成两个组的 总方案数 。由于答案可能很大,将它对 109 + 7 取余 后返回。

算法:
方法一:排序
找到不相交的区间个数cnt,最终分为2个组,每个区间有两种选择(a,b组),最终组合数为2^cnt

func countWays(ranges [][]int) int {
    mod := 1000000007
    sort.Slice(ranges, func(i, j int) bool {
        if ranges[i][0] == ranges[j][0] {
            return ranges[i][1] < ranges[j][1]
        }
        return ranges[i][0] < ranges[j][0]
    })
    cnt := 1
    rightest :=  ranges[0][1]
    for index := 0; index < len(ranges); index ++ {
        if ranges[index][0] <= rightest {
            // cnt ++
            rightest = max(rightest, ranges[index][1] )
        } else {
            cnt ++
            // leftest = ranges[index][0]
            rightest = ranges[index][1]
        }
    }
    ans := 1
    for i := 1; i <= cnt; i ++ {
        ans = ans * 2 % mod
    }
    return ans
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}