搜索插入位置

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

来源:力扣(LeetCode)第35题

链接:https://leetcode-cn.com/problems/search-insert-position

两种二分查找模版:

  1. target = 要查找的值
  2. left = 0, right = arr.length
  3. while left < right:
  4. mid = (left + right) >> 1
  5. // 为了防止数组溢出,也可以写成left + (right - left) >> 1
  6. if arr[mid] == target:
  7. return arr[mid]
  8. elif arr[mid] > target:
  9. right = mid
  10. else:
  11. left = mid + 1
  1. target = 要查找的值
  2. left = 0, right = arr.length - 1
  3. while left <= right:
  4. mid = (left + right) >> 1
  5. // 为了防止数组溢出,也可以写成left + (right - left) >> 1
  6. if arr[mid] == target:
  7. return arr[mid]
  8. elif arr[mid] > target:
  9. right = mid - 1
  10. else:
  11. left = mid + 1

代码:

  1. class Solution:
  2. def searchInsert(self, nums: List[int], target: int) -> int:
  3. left = 0
  4. right = len(nums)
  5. while left < right:
  6. mid = (left + right) >> 1
  7. if nums[mid] == target:
  8. return mid
  9. elif nums[mid] > target:
  10. right = mid
  11. else:
  12. left = mid + 1
  13. return left # 基本和模版一样,就是如果没有找到的话,就返回left,可以自己推测出来
  1. class Solution {
  2. public int searchInsert(int[] nums, int target) {
  3. int left = 0, right = nums.length - 1;
  4. while (left <= right) {
  5. int mid = left + ((right - left) >> 1);
  6. if (nums[mid] == target) return mid;
  7. else if (nums[mid] < target) left = mid + 1;
  8. else right = mid - 1;
  9. }
  10. return left;
  11. }
  12. }

复杂度分析:

  • 时间复杂度:O(logn) 二分查找
  • 空间复杂度:O(1)