# 二分查找

# 1. 描述

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

示例:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

# 2. 实现

(1)递归版

function binarySearch(arr, target, l, r) {
    if (l > r) return -1
    let index = -1
    let midIndex = Math.floor((r + l) / 2)
    let midVal = arr[midIndex]

    if (midVal > target) {
        index = binarySearch(arr, target, l, midIndex - 1)
    } else if (midVal < target) {
        index = binarySearch(arr, target, midIndex + 1, r)
    } else {
        return midIndex
    }
    return index
}

(2)非递归

var search = function (nums, target) {
    let l = 0
    let r = nums.length - 1
    while (r >= l) {
        let mid = l + Math.floor((r - l) / 2)
        if (nums[mid] === target) {
            return mid
            r = --mid
        } else if (nums[mid] < target) {
            l = ++mid
        } else {
            r = --mid
        }
    }
    return -1
}

Go 语言实现:

func BinarySearch(arr []int, target int, left int, right int) int {
    l := left
    r := right
    for {
        if l > r {
            return -1
        }
        mid := (l + r) / 2
        midNum := arr[mid]
        if midNum == target {
            return mid
        } else if target > midNum {
            l = mid + 1
        } else {
            r = mid - 1
        }
    }
}

复杂度

  • 时间复杂度:O(logn)。
  • 空间复杂度:O(1)。

作者:LeetCode-Solution 链接:leetcode-cn.com (opens new window) 来源:力扣第 704 题(LeetCode)

更新时间: 12/30/2021, 9:57:33 AM