一、题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
二、思路分析
边界 如果nums[0] 小于目标值,则目标值放在数组最前面,返回0
如果nums[nums.length - 1] 大于目标值,则目标值放在数组最后,即返回nums.length
数组循环 (1) 如果没有目标值,就寻找目标值两侧数字 i 和 i+1
(2) 若数组中有相同值,直接返回 i
第二种是二分法 这个不太懂
三、AC 代码:
1.循环查找,暴力
var searchInsert = function(nums, target) {
if(nums[0] > target) return 0
if(nums[nums.length - 1] < target) return nums.length
for(let i = 0; i < nums.length; i++) {
if(nums[i] < target && nums[i + 1] > target) {
return i + 1
}
if(nums[i] === target) {
return i
}
}
};
2.二分法
var searchInsert = function (nums, target) {
let left = 0, right = nums.length - 1;
while (left <= right) {
const mid = (left + right) >> 1;
if (nums[mid] === target) return mid;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
};
四、总结:
暴力解法,简单好像,我需要研究一下二分法,虽然懂什么意思,但是写不出来
本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情