携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
「示例1:」
输入: nums = [1,3,5,6], target = 5
输出: 2
「示例2:」
输入: nums = [1,3,5,6], target = 2
输出: 1
「示例3:」
输入: nums = [1,3,5,6], target = 7
输出: 4
「提示:」
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 为 无重复元素 的 升序 排列数组
-104 <= target <= 104
解题思路
// 第一种
若目标元素不在原始数组中
目标元素小于第一个元素,返回索引0
目标元素大于最后一个元素,返回索引nums.length
目标元素在两元素之间,返回较大值索引
若目标元素在原始数组中,返回目标元素索引
// 第二种
如果你完全理解了二分算法。那么你就会发现,二分算法最后l和r下标对应的值就是这个数组相邻的两个值
那么在进行最后一次循环(l===r)的时候,一定会找到那个值,也就是nums[l]||nums[r]
但是如果依旧没找到,那么r就会mid-1,就会跳出循环。
这个时候r代表的就是上一个值了,那么这个目标值插入的位置就是此时的l了
代码实现
// 第一种
var searchInsert = function(nums, target) {
if(target < nums[0]) {
return 0;
} else if(target > nums[nums.length-1]) {
return nums.length;
} else {
for(var i=0, len=nums.length; i<len; i++) {
if(nums[i] == target) {
return i;
} else if(nums[i] < target && nums[i+1] > target) {
return i+1;
}
}
}
};
// 第二种
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let l = 0
let r = nums.length - 1
while(l <= r) {
let mid = l + ((r - l) >> 1)
if (nums[mid] === target) {
return mid
} else if (nums[mid] < target) {
l = mid + 1
} else if (nums[mid] > target) {
r = mid - 1
}
}
return l
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;
\