1. 题目描述

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

你可以假设数组中无重复元素。

示例 1:

  1. 输入: [1,3,5,6], 5
  2. 输出: 2

示例 2:

  1. 输入: [1,3,5,6], 2
  2. 输出: 1

示例 3:

  1. 输入: [1,3,5,6], 7
  2. 输出: 4

示例 4:

  1. 输入: [1,3,5,6], 0
  2. 输出: 0

2. 解题思路

这道题最直接的思路就是直接遍历数组,锁定目标值的位置。该方法的时间复杂度为O(n)。

还可以使用二分查找。二分法的时间复杂度为O(logn)。

3. 代码实现

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number}
  5. */
  6. var searchInsert = function(nums, target) {
  7. for(let i = 0; i < nums.length; i++){
  8. if(target <= nums[i]){
  9. return i
  10. }
  11. }
  12. return nums.length
  13. };

二分法:

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number}
  5. */
  6. var searchInsert = function(nums, target) {
  7. let left = 0, right = nums.length - 1
  8. while(left <= right){
  9. const mid = (left + right) >> 1 // >>1用于获取两个数的平均值,向下取整
  10. if(nums[mid] === target){
  11. return mid
  12. }else if(nums[mid] > target){
  13. right = mid - 1
  14. }else{
  15. left = mid + 1
  16. }
  17. }
  18. return left
  19. };

3. 提交结果

二分法:
35.  搜索插入位置 - 图1