35. 搜索插入位置

44 阅读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

 

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 为 无重复元素 的 升序 排列数组
  • -104 <= target <= 104

题解

由于题目要求O(logN)的时间复杂度,考虑使用二分查找。

本题与普通的二分查找没有什么区别,先设定left指向左侧下标,right指向右侧下标,再计算中间下标mid, 每次比较nums[mid]target之间的大小进行判断,相等直接返回下标,nums[mid] < targetleft = mid + 1右移, nums[mid] > targetright = mid - 1左移, 查找结束如果没有相等值则返回leftleft为插入的位置。

代码

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0, right = nums.length - 1;
    
    while(left <= right) {
        let mid = left + Math.floor((right -left) / 2);
        if (nums[mid] === target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return left;
};