题目地址(35. 搜索插入位置)

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

题目描述

  1. 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  2. 请必须使用时间复杂度为 O(log n) 的算法。
  3. 示例 1:
  4. 输入: nums = [1,3,5,6], target = 5
  5. 输出: 2
  6. 示例 2:
  7. 输入: nums = [1,3,5,6], target = 2
  8. 输出: 1
  9. 示例 3:
  10. 输入: nums = [1,3,5,6], target = 7
  11. 输出: 4
  12. 示例 4:
  13. 输入: nums = [1,3,5,6], target = 0
  14. 输出: 0
  15. 示例 5:
  16. 输入: nums = [1], target = 0
  17. 输出: 0
  18. 提示:
  19. 1 <= nums.length <= 104
  20. -104 <= nums[i] <= 104
  21. nums 为无重复元素的升序排列数组
  22. -104 <= target <= 104

前置知识

  • 二分查找

公司

  • 暂无

思路

与二分查找一样 但是最后多加了个返回插入位置的条件

关键点

image.png
image.png
image.png
这时继续进入循环 触发了nums[mid] < target的条件 使得begin+1 也就是新元素插入的位置
image.png
如果情况改变 end比left小了 直接就返回left

所以无论是哪种情况 最后返回的应插入的元素的位置都是left

代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public int searchInsert(int[] nums,
  3. int target) {
  4. int begin = 0, end = nums.length - 1;
  5. while (begin <= end) {
  6. int mid = (begin + end) / 2;
  7. if (nums[mid] > target) {
  8. end = mid - 1;
  9. } else if (nums[mid] < target){
  10. begin = mid + 1;
  11. }else {
  12. return mid;
  13. }
  14. }
  15. return begin;
  16. }
  17. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:35. 搜索插入位置 - 图5#card=math&code=O%28logn%29&id=kvZyN)
  • 空间复杂度:35. 搜索插入位置 - 图6#card=math&code=O%28n%29&id=lsig7)