更多精彩内容,请关注【力扣简单题】。
题目
难度:
类型:数组
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
解答
这是一道典型的二分法问题。我们将整个数组看成一条线段,将这条线断从中间切开,查看线段中间位置所在的值和插入数之间的大小关系,根据此大小关系可以抛弃一半线段。
这里需要注意的有:
初始化,用两个端点下标left和right进行代表当前研究的线段,分别设置成数组两端数字下标;
控制条件,只要左端点不大于右端点,即可执行循环过程,这样做也可以解决输入数组仅有一个元素的情况;
最后跳出循环后返回值(插入target的位置)必须是左端点坐标,如果输入为空时,应该返回0,即不执行循环。
class Solution:
def searchInsert(self, nums, target):
left, right = 0, len(nums)-1 # 初始化左右端点位置
while left <= right: # 当条件合法时
mid = left + (right - left) // 2 # 获取中点,如果是偶数取靠左的位置
if nums[mid] == target: # 找到该数
return mid # 直接返回
elif nums[mid] > target: # 如果当前位置数比插入值大
right = mid - 1 # 更新右端点
else: # 如果当前位置数比插入值小
left = mid + 1 # 更新左端点
return left # 返回插入位置,这里是左端位置
如有疑问或建议,欢迎评论区留言~