1. 二分查找算法核心原理与实现
二分查找是计算机科学中最基础且高效的搜索算法之一,它能在O(log n)时间复杂度内完成有序数组的查找操作。作为一名算法工程师,我经常需要在各类场景下应用二分查找的变体,今天就来系统梳理四种最常用的二分查找变体及其实现细节。
二分查找的核心思想是"减而治之":通过每次比较将搜索范围缩小一半。这种策略之所以有效,关键在于数组必须是有序的(本文以非递增数组为例)。理解二分查找的关键在于把握三个核心要素:
- 循环不变量(Loop Invariant):在每次迭代中保持的特定条件
- 边界更新策略:如何根据中间值比较结果调整搜索边界
- 终止条件:何时结束搜索并返回结果
重要提示:二分查找的难点不在于记住代码模板,而在于理解每个变体对应的循环不变量。写代码时应该先明确循环不变量,再推导边界更新逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 四种基础二分查找变体详解
2.1 第一个大于target的元素下标
这是最常用的二分查找变体之一,适用于需要找到目标值右边界的情况。让我们深入分析这个实现:
cpp复制int binarySearch(vector<int>& nums, int target){
int left = 0;
int right = nums.size() - 1;
while(left <= right){
int mid = left + (right - left)/2; // 防止溢出
if(nums[mid] <= target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return left; // 没有符合条件元素时返回nums.size()
}
循环不变量分析:
- 每次循环保持:left左侧元素(不含left)都<=target
- right右侧元素(不含right)都>target
- 终止时:right == left - 1,形成[...right, left...]的分界
- 最终状态:所有<=target的元素都在left左侧,>target的元素从left
