1. 题目描述
题目连接:https://leetcode-cn.com/problems/search-insert-position
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为的算法。
2. 题解
2.1 结题思路
(1)用for循环遍历,时间复杂度
(2)二分法,时间复杂度
二分法图示:
图1. 二分法查找图示
假设一共有个数字, 第一次查找的区间大小为;第二次查找区间为;,直至找到目标为止。假设查找次数为,则有。
2.2 代码
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
index_left = 0
index_right = len(nums)
# 首先在边界处几个特殊情况先考虑
if target <= nums[0]:
return 0
elif target == nums[-1]:
return index_right-1
elif target > nums[-1]:
return index_right
else:
while 1:
i = int((index_left + index_right)/2)
if nums[i] == target:
# 正好是target的位置
return i
elif index_right - index_left == 1:
# 左边小于,右边大于,且没有gap
return index_right
elif nums[i] > target:
# 取左边区间
index_right = i
elif nums[i] < target:
# 取右边区间
index_left = i
2.3 结果
示例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