数组 - 二分查找
本题以力扣上的704号题目为例,讲解一下二分查找的具体流程。
大概意思是在一个有序序列中,查找某个目标值,找到就返回该目标值在有序序列中的下标。没找到就返回-1。
因为序列是有序的,就表示我们现将序列分成两个区间,任取一个保证这个区间一定大于target,或者一定小于target。
当区间中的值全部都大于target,就表示target是在另一区间内,这时候我们一下子就把所有的区间缩小了一半。
一直这样按照区间划分的方式,如果最后在序列中没有搜索到,直接返回-1,只要查找到就返回target的下标。
在这里有两个点需要注意
-
left和right怎么初始化
- 左闭右闭
- 左闭右开
-
区间变化的时候是
mid-1还是直接赋值mid
func search(nums []int, target int) int {
left, right := 0, len(nums) - 1 // 这里就表示左闭右闭
for left <= right { // 因为我们的left和right都是合法的,也就是都能够取得到数据,所以需要 <=
mid := (left+right)/2
if nums[mid] == target {
return mid
}else if target > nums[mid] {
left = mid + 1
}else {
right = mid - 1
}
}
return -1
}
总结来说,就是我们将有序序列分成两个区间
- 如果左区间的最大值都大于目标值,那么目标值就在这个区间内
- 如果右区间的最小值都小于目标值,那么目标值就在这个区间内