題目詳情:
給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。
請(qing)必(bi)須使用時間復雜度為 O(log n) 的算(suan)法。
示例:
輸入: nums = [1,3,5,6], target = 5
輸出: 2
解題思路:
O(log n)時間復雜度的算法,那就是考到了二分查找的思想了。
首先(xian),定義指針 left 指向數(shu)組(zu)開頭,指針 right 指向數(shu)組(zu)末尾。
然后,進入循環,當 left 小于(yu)等于(yu) right 時,執行以下操(cao)作(zuo):
計算中間位置的索引 mid,使用 Math.floor 函數取整。
如果中間位置的元素與目標值相等,則直接返回 mid。
如果中間位置的元素小于目標值,則說明目標值在右半部分,將 left 更新為 mid + 1。
如果中間位置的元素大于目標值,則說明目標值在左半部分,將 right 更新為 mid - 1。
最終循環結束后,返(fan)回 left 的(de)值(zhi)作為插入(ru)位置。
代碼實現:
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));