LeetCode35-搜索插入位置 | 算法练习系列

118 阅读2分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

前言

js每日一道算法练习题,今日继续,今天工作搞的好烦,各种情况下的页面刷新,等有空闲了把前端用到的各种刷新方式都整理一下,言归正传,今天来一道简单的题泄泄

题目描述

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

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

解题思路

  • 题目中的要求是判断目标数字是否在目标数组中,如果在的话就输出目标数字的下标,如果不在的就返回它将被插入的位置
  • 根据题目要求以及给的条件,我们可以通过二分查找来找到存在数组中的情况的下标,通过二分查找不断的逼近和目标数组相等的数字即可得到结果,下面上代码
var searchInsert = function(nums, target) {
    const n = nums.length;
    let left = 0, right = n - 1, curr = n;
    while (left <= right) {
        let mid = ((right - left) >> 1) + left;
        if (target <= nums[mid]) {
            curr = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return curr;
};
  • 上面代码通过二分查找可以达到我们想要的结果,但上述代码还使用到了位运算,看起来还是挺麻烦的
  • 作为一个合格的api调用工程师怎么能放着api而不用呢,二话不说,我直接想到了sort和indexOf,如果用上这两个api我们就要分两种情况,一种是输入数字已经在数组中,那我们直接输出nums.indexOf(target)即可,如果输入数字不存在于数组中,那我们不妨先把这个数字push到数组中,再进行排序,然后再输出nums.indexOf(target)即可, 不出所料,果然可行,代码如下
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    result = nums.indexOf(target)
    if(result>=0){
        return result
    }else{
        nums.push(target)
        let arr = nums.sort((a,b)=>a-b)
        return arr.indexOf(target)
    }
};

总结

api工程师没跑了,哈哈哈,虽然使用sort结合indexOf能解决问题,并且代码看起来更少,但其实它的效率是很低的,不如二分查找的方法效率高,能不用这种方法还是不要用,话不多说,继续努力,gogogo!!!