题目

题目来源:力扣(LeetCode)

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

示例 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

思路分析

根据示例 1:

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

如果目标元素存在于数组中,返回的是该元素在数组中的位置。

根据示例 3:

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

如果目标元素大于输入数组中的最后一个元素,返回数组的最后一个元素的下标 + 1。

根据示例 2:

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

需要返回第 1 个 大于等于(等于的情况可以看示例 1,这里省略) 目标元素 2 的下标,因此输出 1 。

根据上述分析,如果数组中如果存在这个目标值,我们返回的是索引位置,如果目标值不存在于数组中,返回也是索引位置,因此我们可以将两个条件合并得出最后的目标:「在一个有序数组中找第一个大于等于 target 的下标」
问题转化到这里,直接套用二分法即可,即不断用二分法逼近查找第一个大于等于 target 的下标。

  1. // 搜索第一个大于或等于的X的元素位置,这个二分就是前面一堆0,后面一堆1,查找第一个1的这
  2. 种二分模型。
  3. var searchInsert = function (nums, target) {
  4. let head = 0, tail = nums.length, mid;
  5. while (head < tail) {
  6. mid = (head + tail) >> 1;
  7. if (nums[mid] < target) head = mid + 1;
  8. else tail = mid;
  9. }
  10. return head;
  11. };

https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/