LC 704二分查找简单第 15 / 95 题

二分查找

Binary Search

二分基础
本机进度仅保存在当前浏览器

题目描述

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

示例:nums = [-1, 0, 3, 5, 9, 12],target = 9,输出 4。

解题思路

  1. 二分的骨架:在闭区间 [l, r] 内,取中点与目标比较,每次淘汰一半。
  2. nums[mid] < target 说明答案只可能在右半段,l = mid + 1;反之 r = mid - 1。
  3. 循环条件 l <= r 对应闭区间语义;区间语义(闭/左闭右开)一旦选定,边界增减必须成套,这是二分出 bug 的主要来源。
  4. 中点用 l + (r - l) // 2 计算可避免大数相加溢出(其他语言中尤其重要)。

参考实现

查看参考实现Python · 建议先自行作答
def search(nums, target):
    # 闭区间 [l, r] 标准二分
    l, r = 0, len(nums) - 1
    while l <= r:
        mid = l + (r - l) // 2
        if nums[mid] == target:
            return mid
        if nums[mid] < target:
            l = mid + 1
        else:
            r = mid - 1
    return -1

复杂度与归属

时间复杂度O(log n)
空间复杂度O(1)
所属分类二分查找
题源LeetCode 704

关联教程

返回题图鉴