【LeetCode】每日一题 搜索插入位置

115 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

35. 搜索插入位置

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

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

解题思路

// 第一种
若目标元素不在原始数组中
目标元素小于第一个元素,返回索引0
目标元素大于最后一个元素,返回索引nums.length
目标元素在两元素之间,返回较大值索引
若目标元素在原始数组中,返回目标元素索引
​
// 第二种
如果你完全理解了二分算法。那么你就会发现,二分算法最后l和r下标对应的值就是这个数组相邻的两个值
​
那么在进行最后一次循环(l===r)的时候,一定会找到那个值,也就是nums[l]||nums[r]
​
但是如果依旧没找到,那么r就会mid-1,就会跳出循环。
​
这个时候r代表的就是上一个值了,那么这个目标值插入的位置就是此时的l了

代码实现

// 第一种
var searchInsert = function(nums, target) {
  if(target < nums[0]) {
    return 0;
  } else if(target > nums[nums.length-1]) {
    return nums.length;
  } else {
    for(var i=0, len=nums.length; i<len; i++) {
      if(nums[i] == target) {
        return i;
      } else if(nums[i] < target && nums[i+1] > target) {
        return i+1;
      }
    }
  }
};
​
// 第二种
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let l = 0
    let r = nums.length - 1
​
    while(l <= r) {
        let mid = l + ((r - l) >> 1)
​
        if (nums[mid] === target) {
            return mid
        } else if (nums[mid] < target) {
            l = mid + 1
        } else if (nums[mid] > target) {
            r = mid - 1
        }
    }
    return l
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;

\