题目描述
遍历每个位置,并计算当前位置是否可达
用max 保存当前位置可以跳转的最大距离
每遍历一个位置,判断这个位置i与max的大小,如果i大说明之前的所有位置的都没有跳跃到当前位置,当前位置不可达直接返回false.
func canJump(nums []int) bool {
//长度
length := len(nums)
var max int
for i:=0;i<length;i++{
if max<i{
return false
}
max = Max(max,i+nums[i])
}
return true
}
//go 没有 math.min/max(int,int)的方法
//都是float64的,不过这个实现比较简单,自己来
func Max(x, y int) int {
if x < y {
return y
}
return x
}
刷算法不应该只是刷算法而已
所以,学习一下用时比我快的代码。
//这是用时最快的了,4ms 诈一看,感觉和我的差不多
func canJump(nums []int) bool {
maxIndex := 0
for i, v := range nums { //开始遍历,他用的是range,我用的是for循环,应该nums结构简单,
//所以并没有影响性能反而好,不过循环的结构体是一个比较复杂的,
//数量多,建议不要用range,range是拷贝结构体的值得,而for 普通循环是
//用指针
if maxIndex < i {
return false
} // 判断当前位置是否可达,我也是这样做的
maxIndex = max(maxIndex, i+v) //保存最大值,
if maxIndex >= len(nums)-1 { //他这边判断当前最大值是否已经可达到数组最后了
return true //可达就结束了,返回true ,其他就可以不用遍历了,就节约时间了
} //而我是全部遍历一遍,然后再判断最后一个位置是否可达,做了很多无用功
} //学习了学习了
return false
}
func max(x, y int) int {
if x > y {
return x
} else {
return y
}
}