LC435

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,

  1. 由于float64类型要处理infinity和not-a-number这种值,而他们的处理非常复杂,一般用户没有能力,所有go需要为用户提供系统级别的解决办法。
  2. 对于int/int64类型的数据,min/max的实现非常简单直接,用户完全可以自己实现

Go的自定义排序

Go语言包中包含了排序包 sort,其中针对一般的strings、int类型已经有了排序方法

sort.Ints(a []int)
sort.Strings(a []string)

假如要对类型A自定义排序,步骤如下:

  1. 我们先定义类型 []A,取名为 B(比如)
type B []A

之所以要再定义个A的切片类型是因为若要实现一个自定义的排序,就要实现 sort 包的排序接口。要排序的集合必须包含一个数字类型的索引,所以待排序的数据类型只能是数组或者切片。

  1. 分别实现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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值