二分查找

56 阅读1分钟

前言

二分查找是力扣上的一道简单题,题号704。评论里面有人戏称这题这叫做算法第一题。
也许是因为它是《图解算法》上的第一道题目吧,这本书对于新人确实是比较友好。

题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

解题思路: 定义两个指针,一个在数组的最左侧,一个在数组的最右侧。当左指针小于等于右指针,每次取数组的中间那个元素,将目标值与中间元素对比。如果目标值大于中间元素,则将左指针移到中间值索引 + 1的位置。如果目标值小于中间元素,则将右指针移动到中间值索引 - 1的位置。如果目标值等于中间元素则返回索引。

javascript代码:

const search = (nums, target) => {
    // 定义左指针在数组最左侧,右指针在数组最右侧
    let left = 0, right = nums.length - 1
    while(left <= right) {
        let mid = Math.floor((left + right)/2) // 中间元素的索引
        let num = nums[mid] // 中间值
        if (target === num) { // 找到目标值,返回索引
            return mid
        } else if (target > num ) { 
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return -1 // 没有找到返回 -1
}

go代码:

func search(nums []int,target int) int {
    left,right := 0,len(nums) - 1
    for left <= right { 
        mid := (left + right)/2
        num := nums[mid]
        if target == num {
            return mid
        } else if target > num {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return -1
}