【每日LeetCode】手把手教你刷题之搜索插入位置

640 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情

搜索插入位置

这是力扣第35题

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。

image.png

解题思路

这是一道简单题,题目不难,但是规定了要使用时间复杂度为O(log n)的算法,这一点对解题思路上来说会有一些限制。接下来就来介绍几种不同的解题思路来给大家看一看。

循环法

循环法顾名思义,就是将数组循环遍历一遍,不过在循环前需要使用 indexOf(target) 将目标值记录下来,这是循环的条件。当目标值在数组中,就返回该目标值的下标;如果不在,则就继续遍历。

相关代码如下:

var searchInsert = function(nums, target) {
     let result = nums.indexOf(target)
    if (result === -1) {
        for (let index in nums) {
            if (nums[index] > target) return index
            if(nums[nums.length-1] < target) return nums.length
        }
    } else {
        return result
    }

二分法

我们只需要在数组中找到一个存在的目标值即可,典型地可以使用二分法来解决。用二分法逼近查找第一个大于等于目标值的下标。不过对于二分法来说,一定要处理好相关边界问题,关于边界问题的处理,之前的文章里有提到过。

相关代码如下:

var searchInsert = function(nums, target) {
    const n = nums.length;
    let left = 0, right = n - 1, ans = n;
    while (left <= right) {
        let mid = ((right - left) >> 1) + left;
        if (target <= nums[mid]) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
};

indexOf法

这个思路就是单纯地使用 indexOf 方法来解决这道题目。首先利用 indexOf 方法判断数组中是否有目标值 target,有的话就返回下标,如果返回值小于0的话直接将目标值加入到数组中并对数组进行排序,然后遍历输出目标值 target 在新数组中的下标。这种方法很简单,比较容易理解,大家可以多研究一下 indexOf 方法的妙用。

相关代码如下:

 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
     }
};

总结

以上就是对 力扣 35 题搜索插入位置 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。