[路飞]_35. 搜索插入位置

85 阅读1分钟

题目路径

题目描述

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

请必须使用时间复杂度为 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

解题思路

  • 二分算法
  • 设置一个head指针,tail指针,mid指针
  • 当tail指针减去head指针大于3的时候,用二分算法查找,小于3的时候用顺序查找
  • 在二分查找内,mid的值为tail加上head除以2
  • 当nums[mid]大于等于目标值时,tail就等于mid,否者head = mid + 1
  • 在顺序查找中,当nums[i]大于等于目标值时,返回当前的i,最后否者返回num的长度,也就是在数组中没有找到比目标值小的,所以把目标值放在最后

代码

var searchInsert = function(nums, target) {
    let head = 0, tail = nums.length - 1, mid;
    while (tail - head > 3) {
        mid = (tail + head) >> 1;
        if(nums[mid] >= target) tail = mid;
        else head = mid + 1
    }
    for (let i = head; i <= tail; i++) {
        if(nums[i] >= target) return i;
    }
    return nums.length;
};