/**
* 时间复杂度:O(log n),其中 n 是数组 nums 的长度。二分查找算法的时间复杂度为 O(log n),因为每次迭代都会将搜索范围缩小一半。
* 空间复杂度:O(1),使用了常数级别的额外空间。算法只使用了几个变量来存储索引和中间结果,没有使用与输入规模相关的额外空间。
*/
var search = function (nums, target) {
// 定义左右指针
let left = 0;
let right = nums.length - 1;
// 结束条件是左右指针相遇
while (left <= right) {
// 计算中间索引,避免溢出
const mid = left + Math.floor((right - left) / 2);
// 如果中间值等于目标值,返回索引
if (nums[mid] === target) {
return mid;
} else if (nums[mid] < target) {
// 如果中间值小于目标值,说明目标值在右半部分,更新左指针
left = mid + 1;
} else {
// 如果中间值大于目标值,说明目标值在左半部分,更新右指针
right = mid - 1;
}
}
// 如果循环结束后仍未找到目标值,返回 -1
return -1;
};