题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target。如果 target 存在返回下标,否则返回 -1。
你必须编写一个具有 O(log n) 时间复杂度的算法。
示例 1: 输入:nums = [-1,0,3,5,9,12], target = 9 输出:4 解释:9 出现在 nums 中并且下标为 4
示例 2: 输入:nums = [-1,0,3,5,9,12], target = 2 输出:-1 解释:2 不存在 nums 中因此返回 -1
提示:
- 你可以假设
nums中的所有元素是不重复的。 n将在[1, 10000]之间。nums的每个元素都将在[-9999, 9999]之间。

算法原理
二段性
二分查找的核心在于利用数据的二段性。对于有序数组,我们可以根据中间值与目标值的比较结果,将搜索区间划分为两部分:一部分包含目标值,另一部分不包含。每次比较都能排除掉一半的无效数据,这就是为什么它能比线性遍历更高效。
时间复杂度
由于每次迭代都将搜索范围缩小一半,最坏情况下直到剩下 1 个元素才结束,因此时间复杂度为 O(log n)。

代码实现
在编写模板时,有几个关键点需要注意。首先是循环条件,通常使用 left <= right 来确保区间内所有元素都被检查到。其次是中点计算,直接 (left + right) / 2 在某些语言或极端数据下可能导致整数溢出,更安全的写法是 left + (right - left) / 2。
下面是基于 Java 语言的完整实现:
public int search(int[] nums, int target) {
int left = 0, right = nums.length - ;
(left <= right) {
left + (right - left) / ;
(nums[mid] > target) {
right = mid - ;
} (nums[mid] < target) {
left = mid + ;
} {
mid;
}
}
-;
}




