题目描述:给定一个升序整型数组 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)(递归栈)。
认知任务: 观察递归二分过程,理解每次搜索区间减半,从而推导复杂度。
每次递归将搜索范围缩小一半,因此比较次数为 log₂(n) 级别。
不变量: 在每一轮递归中,arr[start..end] 保持有序,且 target 只可能存在于该区间内。
关键变量: low, high, mid,每次排除一半。
mid = low + (high - low) / 2
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
题号:0 (二分查找) → 迁移 713
触发信号:有序数组查找 → 子数组乘积计数
核心表示:二分区间 [left,right] / 滑动窗口 [left,right] 与 product
关键不变量:二分:target 在区间内;滑动窗口:product < k 时窗口内所有子数组合法
复杂度:二分 O(log n);滑动窗口 O(n)
常见错误:忘记更新 product 或 left 移动时未除 nums[left]
可迁移题型:子数组和、最小覆盖子串