返回

LeetCode每日一题:35.搜索插入位置

后端

如今,算法早已是程序员必备的基础功,面对不同的业务场景,总能听到关于如何优化代码效率的讨论。对于算法的考察也成为了技术面试的重要一环。LeetCode作为程序员练习算法题的热门网站之一,提供了海量优质题目,还有每日一题的栏目,来检验大家的算法能力。在2021年12月13日,LeetCode的每日一题是35. 搜索插入位置。我们一起来看看这道题吧。

题目

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

注意:

  • 请必须使用时间复杂度为O(log n)的算法。

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

示例 4:

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

示例 5:

输入: nums = [1], target = 0
输出: 0

解题思路

这道题考察的是二分查找算法,二分查找算法的基本思想是:

  • 在有序数组中,选取中间元素,将数组分为左右两个部分。
  • 比较中间元素与目标值的大小,如果相等,则返回中间元素的索引。
  • 如果中间元素小于目标值,则继续在右侧部分进行二分查找。
  • 如果中间元素大于目标值,则继续在左侧部分进行二分查找。

重复以上步骤,直到找到目标值或数组为空。

代码实现

def search_insert_position(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:
            left = mid + 1
        else:
            right = mid - 1

    # 如果没有找到目标值,返回它将会被插入的位置
    return left

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。
  • 空间复杂度:O(1),因为我们没有使用额外的空间。

总结

这道题考察的是二分查找算法,难度不大,但需要对二分查找算法有比较好的理解。