LC.435无重叠区间
这题第二次写了,有思路但还是写反了,特此记录提醒。
type in [][]int
func (p in) Len() int {
return len(p)
}
func (p in) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func (p in) Less(i, j int) bool {
return p[i][1] < p[j][1]
}
func eraseOverlapIntervals(intervals [][]int) (res int) {
if len(intervals) <= 1 {
return
}
sort.Sort(in(intervals))
right := intervals[0][1]
for i := 1; i < len(intervals); i++ { //这次想到贪心了,但还是排序排反了
//从左向右遍历每次都想选右边界最小的,所以肯定要按右边界排序啊,要不然按左边界,后面可能右边界更小,乱套了
if intervals[i][0] < right { //局部最优,先选右边界最小的,如果后一个左边界小于这个右边界,这个区间肯定是要舍去的
//因为如果不舍去,右边界不就会无端增大了吗
res++ //舍去数+1
} else { //如果这时左边界大于等于右边界,说明找到了更紧凑的靠左的的区间,更新right值
right = intervals[i][1]
}
}
return
}
func Min(x, y int) int {
if x < y {
return x
}
return y
}
Go的几个注意事项:
Min/Max
Go语言math包里面定义了Min/Max函数,但是是float64类型的,而并没有整数类型的Min/Max,
- 由于float64类型要处理infinity和not-a-number这种值,而他们的处理非常复杂,一般用户没有能力,所有go需要为用户提供系统级别的解决办法。
- 对于int/int64类型的数据,min/max的实现非常简单直接,用户完全可以自己实现
Go的自定义排序
Go语言包中包含了排序包 sort,其中针对一般的strings、int类型已经有了排序方法
sort.Ints(a []int)
sort.Strings(a []string)
假如要对类型A自定义排序,步骤如下:
- 我们先定义类型
[]A
,取名为B
(比如)
type B []A
之所以要再定义个A的切片类型是因为若要实现一个自定义的排序,就要实现 sort 包的排序接口。要排序的集合必须包含一个数字类型的索引,所以待排序的数据类型只能是数组或者切片。
- 分别实现3个函数
func (p B) Len() int//返回切片中元素个数
func (p B) Less(i, j int) bool//定义比较函数
func (p B) Swap(i, j int)//定义交换函数
可以猜出 sort.Sort()
函数应该使用的是快排
sort包中接口定义如下:
type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}