数组 - 二分查找

106 阅读1分钟

数组 - 二分查找

本题以力扣上的704号题目为例,讲解一下二分查找的具体流程。 大概意思是在一个有序序列中,查找某个目标值,找到就返回该目标值在有序序列中的下标。没找到就返回-1。 image.png 因为序列是有序的,就表示我们现将序列分成两个区间,任取一个保证这个区间一定大于target,或者一定小于target。 当区间中的值全部都大于target,就表示target是在另一区间内,这时候我们一下子就把所有的区间缩小了一半。 一直这样按照区间划分的方式,如果最后在序列中没有搜索到,直接返回-1,只要查找到就返回target的下标。

在这里有两个点需要注意

  1. left和right怎么初始化

    • 左闭右闭
    • 左闭右开
  2. 区间变化的时候是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
}

总结来说,就是我们将有序序列分成两个区间

  • 如果左区间的最大值都大于目标值,那么目标值就在这个区间内
  • 如果右区间的最小值都小于目标值,那么目标值就在这个区间内