【GO】只维护右端点
视频里面是用一个数组单独记录分开来的区间,但实际上本题只需要记录区间的个数即可。
所以我们可以先排序,确保两个区间相互比较只会出现三种情况:
- 前一个区间包含后一个区间(前一个区间的右端点大于等于后一个区间的左端点,且前一个区间比后一个区间的右端点大)
- 前一个区间与后一个区间有重合,且后一个区间的右端点比前一个的大
- 不重合(前一个区间的右端点小于后一个区间的左端点)
那么我们不难看出,只需要用一个变量来记录合并后区间数,一个变量来记录当前合并区间的右端点即可完成这道题
Go 代码
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"sort"
)
var scanner *bufio.Scanner
func readline() []int {
scanner.Scan()
l := strings.Split(scanner.Text(), " ")
res := make([]int, len(l))
for i, s := range l {
x, _ := strconv.Atoi(s)
res[i] = x
}
return res
}
func main() {
scanner = bufio.NewScanner(os.Stdin)
bs := make([]byte, 20000*1024)
scanner.Buffer(bs, len(bs))
var n int
fmt.Scanf("%d", &n)
m := [][2]int{}
for i := 0; i < n; i++{
r := readline()
m = append(m, [2]int{r[0],r[1]})
}
sort.Slice(m, func(i,j int) bool{
if m[i][0] == m[j][0]{
return m[i][1] < m[j][1]
}
return m[i][0] < m[j][0]
})
count := 1
ed := m[0][1]
for i := 1; i < n; i++{
if m[i][0] <= ed{
if m[i][1] > ed{
ed = m[i][1]
}
}else{
// st = m[i][0]
ed = m[i][1]
count++
}
}
fmt.Println(count)
}