二分查找的三种方式
Go语言版本
仅仅是语言格式不同,但是重在条件的改变
三个模板共性:mid = left+(right-left)/2
模板一:(常用)
1、初始化 left=0 和 right=len(nums)-1
2、for循环退出条件为,left <= right
3、left = mid+1
4、right = mid-1
func search(nums []int, target int) int {
// 模板一
left := 0
right := len(nums)-1
for left <= right {
mid := left+(right-left)/2
if nums[mid] == target {
return mid
} else if nums[mid] > target {
right = mid-1
} else {
left = mid+1
}
}
return -1
}
模板二:
1、初始化 left=0 和 right=len(nums)
2、for循环退出条件为,left < right
3、left = mid+1
4、right = mid
5、需要后处理
模板三:(记住并使用,常用)
1、初始化 left=0 和 right=len(nums)-1
2、for循环退出条件为,left+1 < right
3、left = mid
4、right = mid
5、需要后处理
func search(nums []int, target int) int {
start := 0
end := len(nums)-1
for start+1 < end {
mid := start + (end-start)/2
if nums[mid] == target {
end = mid
} else if nums[mid] < target {
start = mid
} else if nums[mid] > target {
end = mid
}
}
// 后处理,判断最后两个元素是否符合
if nums[start] == target {
return start
}
if nums[end] == target {
return end
}
return -1
}