返回

巅峰对决:LeetCode 35 搜索插入位置(数组、简单)

前端

前言:LeetCode 数组类型题目的相关解法

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

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

请注意:

  • 你可以假设数组中无重复元素。
  • 你可以假设给定的目标值总是在数组中的某个位置上。

示例 1:

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

示例 2:

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

示例 3:

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

思路分析:

本题考察的是二分查找算法的应用。二分查找算法是一种高效的搜索算法,它通过将数组划分为两半,并比较目标值与数组中间元素的值来缩小搜索范围,从而快速找到目标值。

具体步骤如下:

  1. 首先,将数组划分为两半,并找到数组的中间元素。
  2. 将目标值与中间元素的值进行比较。
  3. 如果目标值等于中间元素的值,则返回中间元素的索引。
  4. 如果目标值小于中间元素的值,则将数组的上半部分划分为两半,并重复步骤 1-3。
  5. 如果目标值大于中间元素的值,则将数组的下半部分划分为两半,并重复步骤 1-3。

代码实现:

def search_insert(nums, target):
  """
  :type nums: List[int]
  :type target: int
  :rtype: int
  """
  # 二分查找算法
  left, right = 0, len(nums) - 1

  while left <= right:
    # 计算中间元素的索引
    mid = (left + right) // 2

    # 如果目标值等于中间元素的值,则返回中间元素的索引
    if nums[mid] == target:
      return mid

    # 如果目标值小于中间元素的值,则将数组的上半部分划分为两半
    elif nums[mid] > target:
      right = mid - 1

    # 如果目标值大于中间元素的值,则将数组的下半部分划分为两半
    else:
      left = mid + 1

  # 如果目标值不存在于数组中,则返回它将会被按顺序插入的位置
  return left

复杂度分析:

  • 时间复杂度:由于二分查找算法的时间复杂度为 O(log n),因此本题的时间复杂度也为 O(log n)。
  • 空间复杂度:本题的空间复杂度为 O(1),因为我们只需要使用几个变量来存储中间元素的索引和数组的边界。

总结:

本题是 LeetCode 数组类型题目的经典题目之一,通过本题的学习,可以掌握二分查找算法的应用,以及数组操作的基本技巧。希望对大家有所帮助!