返回
LeetCode每日一题:35.搜索插入位置
后端
2024-01-17 06:49:03
如今,算法早已是程序员必备的基础功,面对不同的业务场景,总能听到关于如何优化代码效率的讨论。对于算法的考察也成为了技术面试的重要一环。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),因为我们没有使用额外的空间。
总结
这道题考察的是二分查找算法,难度不大,但需要对二分查找算法有比较好的理解。