一个问题 为什么多传一个参数与否 运行的结果不一样呢?
本帖最后由 980041382 于 2022-6-18 18:49 编辑两个片段 都是leetcode34题的解法。。。为什么第一版我把数组的长度计算出来传到方法里面就运行正确。。第二版 我直接在方法里面重新计算一下 得到的结果就是错误的呢?
这是正确版本的代码:
package main
func searchRange(nums []int, target int) []int {
len := len(nums)
if len == 0 {
return []int{-1, -1}
}
firstPosition := findFirstPosition(nums, target, len)
//如果开始位置都没有找到目标值 那么肯定就不存在 直接返回即可
if firstPosition == -1 {
return []int{-1, -1}
}
lastPosition := findLastPosition(nums, target, len)
return []int{firstPosition, lastPosition}
}
func findFirstPosition(nums []int, target, len int) int {
left := 0
right := len - 1
for left < right {
mid := left + (right-left)/2
//判断开始位置
if nums < target {
left = mid + 1
} else {
right = mid
}
}
if nums == target {
return left
}
return -1
}
func findLastPosition(nums []int, target, len int) int {
left := 0
right := len - 1
//判断结束位置
for left < right {
mid := left + (right-left+1)/2
if nums > target {
right = mid - 1
} else {
left = mid
}
}
return left
}
这是错误版本的代码:
package main
func searchRange(nums []int, target int) []int {
len := len(nums)
if len == 0 {
return []int{-1, -1}
}
firstPositon := findFirstPosition(nums, target, len)
if firstPositon == -1 {
return []int{-1, -1}
}
lastPostition := findLastPosition(nums, target, len)
return []int{firstPositon, lastPostition}
}
func findFirstPosition(nums []int, target, len int) int {
left := 0
right := len - 1
if left < right {
mid := left + (right-left)/2
//小于一定不是解
if nums < target {
//下一轮的搜索区间是mid+1...right
left = mid + 1
} else {
right = mid
}
}
// 退出循环以后不能确定 nums 是否等于 target,因此需要再判断一次
if nums == target {
return left
}
return -1
}
func findLastPosition(nums []int, target, len int) int {
left := 0
right := len - 1
if left < right {
mid := left + (right-left+1)/2
if nums > target {
right = mid - 1
} else {
left = mid
}
}
return left
}
太粗心了 golang没有while 用for 楼主呆了。。for写成if了。。 本帖最后由 980041382 于 2022-6-18 18:49 编辑
980041382 发表于 2022-6-18 18:40
楼主呆了。。for写成if了。。
入口条件应该用for
页:
[1]