【前端算法每日一题】leetcode-035-搜索插入位置

115 阅读1分钟

题目描述

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

解题思路

  • 通过题目要求时间复杂度为 O(log n),想到了使用二分查找法解决
  • 另外使用 O(n),也可以遍历所有元素解决
  • 两种方法仅供参考

二分查找算法原理

  • 二分查找(Binary Search)算法,也叫折半查找算法。
  • 每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
  • 如果中间元素值大于查找值,则往数组的左边继续查找,如果小于查找值则往数组右边继续查找。
  • 局限性:一般只针对有序数组。

解题代码(JavaScript)

// O(log n)解法
var searchInsert = function (nums, target) {
  let low = 0;
  let high = nums.length - 1;
  while (low <= high) {
    let mid = Math.floor((low + high) / 2);
    if (target === nums[mid]) {
      return mid;
    } else if (target < nums[mid]) {
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  return low;
};

// o(n)解法
var searchInsert = function (nums, target) {
  for (let i = 0; i < nums.length; i++) {
    if (target <= nums[i]) {
      return i;
    }
  }
  return nums.length;
};