JS解决「搜索插入位置」一题

3,821 阅读2分钟

题目

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

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


有一个开发者这样说:

这道题目不难,但是为什么通过率相对来说并不高呢,我理解是大家对边界处理的判断有所失误导致的。

这道题目,要在数组中插入目标值,无非是这四种情况。

  • 目标值在数组所有元素之前
  • 目标值等于数组中某一个元素
  • 目标值插入数组中的位置
  • 目标值在数组所有元素之后

这四种情况确认清楚了,就可以尝试解题了。