题目
题目来源:力扣(LeetCode)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
思路分析
根据示例 1:
输入: [1,3,5,6], 5 输出: 2
如果目标元素存在于数组中,返回的是该元素在数组中的位置。
根据示例 3:
输入: [1, 3, 5, 6], 7 输出: 4
如果目标元素大于输入数组中的最后一个元素,返回数组的最后一个元素的下标 + 1。
根据示例 2:
输入: [1,3,5,6], 2 输出: 1
需要返回第 1 个 大于等于(等于的情况可以看示例 1,这里省略) 目标元素 2 的下标,因此输出 1 。
根据上述分析,如果数组中如果存在这个目标值,我们返回的是索引位置,如果目标值不存在于数组中,返回也是索引位置,因此我们可以将两个条件合并得出最后的目标:「在一个有序数组中找第一个大于等于 target 的下标」。
问题转化到这里,直接套用二分法即可,即不断用二分法逼近查找第一个大于等于 target 的下标。
// 搜索第一个大于或等于的X的元素位置,这个二分就是前面一堆0,后面一堆1,查找第一个1的这
种二分模型。
var searchInsert = function (nums, target) {
let head = 0, tail = nums.length, mid;
while (head < tail) {
mid = (head + tail) >> 1;
if (nums[mid] < target) head = mid + 1;
else tail = mid;
}
return head;
};