LeetCode #0 · 二分查找 · 时间复杂度分析

难度: 简单 数组 二分查找 递归
英文: Binary Search (Time Complexity)

题目描述:给定一个升序整型数组 arr 和目标值 target,实现递归二分查找,返回目标下标,若不存在返回 -1。分析其时间复杂度。

int search(int start, int end, int target, int *arr) {
    if (start <= end) {
        int mid = start + (end - start) / 2;
        if (arr[mid] == target) return mid;
        else if (target > arr[mid])
            return search(mid + 1, end, target, arr);
        else if (target < arr[mid])
            return search(start, mid - 1, target, arr);
    }
    return -1;
}

输入:升序数组,目标值   输出:下标或 -1

约束:数组长度 n ≥ 1,元素为整数。

要求:时间复杂度 O(log n),空间复杂度 O(log n)(递归栈)。

🔍 阶段1-3:理解 · 暴力 · 瓶颈

二分查找

认知任务: 观察递归二分过程,理解每次搜索区间减半,从而推导复杂度。

点击“下一步”开始追踪

🧠 瓶颈思考

每次递归将搜索范围缩小一半,因此比较次数为 log₂(n) 级别。

📐 核心表示 & 不变量

不变量: 在每一轮递归中,arr[start..end] 保持有序,且 target 只可能存在于该区间内。

关键变量: low, high, mid,每次排除一半。

mid = low + (high - low) / 2

⌨️ 代码补全 (Python)

def search(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

🎯 最终 Skill 卡

题号:0 (二分查找) → 迁移 713

触发信号:有序数组查找 → 子数组乘积计数

核心表示:二分区间 [left,right] / 滑动窗口 [left,right] 与 product

关键不变量:二分:target 在区间内;滑动窗口:product < k 时窗口内所有子数组合法

复杂度:二分 O(log n);滑动窗口 O(n)

常见错误:忘记更新 product 或 left 移动时未除 nums[left]

可迁移题型:子数组和、最小覆盖子串