leetcode搜索插入位置(每日计划)

62 阅读2分钟

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

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

我的算法实现:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function (nums, target) {
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] >= target) {
      return i
    }
  }
  return nums.length
}

这道题,看到的第一想法是使用二分搜索的方式,毕竟数组是有序的,但是过后发现实现起来并不是很容易,当然我并没有真正的把这个数组先变成二分搜索的结构,而是采取中间搜索法,就像快速排序那样,但是我并没有想好,导致最后尝试几次都失败了,于是我使用了传统的方法实现了这个方法。

下面这个是我最先开始想实现的,可惜我没想法就开始写代码了,结果头搞大了:

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while(left <= right) {
            int mid = (left + right) / 2;
            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
}

这个算法的优化也是属于我曾经说的那种,那就是“少做无用功”,如果能够在遍历相对更少的次数就能得到结果,说明做的无用功,这其实也是聪明的一种体现。比如学生时代分座位,当你知道同学们的身高的时候,你怎么使用最快的速度算出你坐的位置。


来源:力扣(LeetCode)