题目:
给你一个二维整数数组 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
}