题目详情:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例:
输入: nums = [1,3,5,6], target = 5
输出: 2
解题思路:
O(log n)时间复杂度的算法,那就是考到了二分查找的思想了。
首先,定义指针 left 指向数组开头,指针 right 指向数组末尾。
然后,进入循环,当 left 小于等于 right 时,执行以下操作:
计算中间位置的索引 mid,使用 Math.floor 函数取整。
如果中间位置的元素与目标值相等,则直接返回 mid。
如果中间位置的元素小于目标值,则说明目标值在右半部分,将 left 更新为 mid + 1。
如果中间位置的元素大于目标值,则说明目标值在左半部分,将 right 更新为 mid - 1。
最终循环结束后,返回 left 的值作为插入位置。
代码实现:
function searchInsert(nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] === target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
// 示例输入
const nums = [1, 3, 5, 6];
const target = 5;
// 调用函数并输出结果
console.log(searchInsert(nums, target));