题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:
输入: nums = [1], target = 0
输出: 0
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为无重复元素的升序排列数组
- -104 <= target <= 104
解题思路
如果这道题是在排序数组中寻找是否存在一个目标值,那么我立马就能想到利用二分法在
O(logn)
的时间内找到是否存在目标值。但这题还多了个另外的条件,就是当目标值如果不存在数组中的时候需要返回按顺序插入的位置,但仍然可以使用二分法来解这个题只需要:num[index−1]<目标值≤num[index]
num:数组 index:索引
实现方法
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let left = 0, right = nums.length - 1, x = nums.length;
while (left <= right) {
let numsMid = ((right - left) >> 1) + left;
if (target <= nums[numsMid]) {
x = numsMid;
right = numsMid - 1;
} else {
left = numsMid + 1;
}
}
return x;
};
其他方法
利用indexof
方法查找数据中是否有target,如果有的话返回下标,如果没有的话返回-1。
当返回值小于0的时候:
1.直接将target加入到数组中并对新数据进行排序
2.遍历输出target在新数组中的下标
var searchInsert = function(nums, target) {
let index = nums.indexOf(target)
if (index>=0) {
return index
}else{
nums.push(target)
nums.sort((a,b)=>a-b)
let index = nums.indexOf(target)
return index
}
};
有一个开发者这样说:
这道题目不难,但是为什么通过率相对来说并不高呢,我理解是大家对边界处理的判断有所失误导致的。
这道题目,要在数组中插入目标值,无非是这四种情况。
- 目标值在数组所有元素之前
- 目标值等于数组中某一个元素
- 目标值插入数组中的位置
- 目标值在数组所有元素之后
这四种情况确认清楚了,就可以尝试解题了。