搜索插入位置


给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

自己想到的解法,时间复杂度为 O(n):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let length = nums.length;

if (target <= nums[0]) {
return 0;
} else if (target === nums[length - 1]) {
return length - 1;
} else if (target > nums[length - 1]) {
return length;
} else {
let flag = false;
for (let i = 0; i < nums.length; i++) {
if (target === nums[i]) return i;
else flag = true;
}

if (flag) {
for (let i = 0; i < nums.length; i++) {
if (target >= nums[i] && target <= nums[i + 1]) {
return i + 1;
}
}
}
}

经过 gpt 改进后的代码,时间复杂度为 O(log n),划重点:看到已排序的数组,就要想到二分查找法!记住此代码模板!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}

力扣高赞解题

注意:

二分查找的思路不难理解,但是边界条件容易出错,比如 循环结束条件中 left 和 right 的关系,更新 left 和 right 位置时要不要加 1 减 1。