征服力扣704题:三步掌握经典二分查找算法
题目重解
我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,这正是二分查找的精髓所在。
解题思路解析
用递归实现二分查找:
基准情况1:当搜索范围缩小到单个元素时(l == r),直接比较该元素
基准情况2:当范围剩两个元素时(l+1 == r),分别比较这两个元素
递归过程:计算中间位置,根据中间值与目标值的关系决定向左或向右继续搜索
整个过程就像是在玩"猜数字"游戏,每次猜测都能排除一半的错误答案,直到找到正确答案或确认不存在。递归的终止条件和边界处理确保了搜索的正确性和完整性。
代码注释版
class Solution { public: int binaryselect(vector<int> a, int num, int l, int r) { // 情况1:搜索范围缩小到单个元素 if (l == r) { if (a[l] == num) return l; // 找到目标 else return -1; // 未找到 } // 情况2:搜索范围剩两个元素 if (l + 1 == r) { if (a[l] == num) return l; else if (a[r] == num) return r; else return -1; } // 计算中间位置 int mid = (l + r) / 2; if (a[mid] == num) return mid; // 直接命中 else if (a[mid] < num) return binaryselect(a, num, mid + 1, r); // 向右半部分继续搜索 else return binaryselect(a, num, l, mid - 1); // 向左半部分继续搜索 } int search(vector<int>& nums, int target) { // 从整个数组范围开始搜索 return binaryselect(nums, target, 0, nums.size() - 1); } };
原创内容 转载请注明出处