首先先看题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
这是寻找插入位置的一道题。最简单的方法是遍历这个列表并比较与target的大小。若比较得到大于target,则返回当前位置;若遍历到列表末尾,则返回列表长度。然而该算法的复杂度O(n),可以使用二分查找法将复杂度降为O(logn)。
二分算法的思想是,计算当前区间内的中间元素的值,该元素把区间分为前后两部分,然后与target比较,若大于target则在前一个区间内重复上述流程,若小于target则在后一个区间重复,若等于target则返回中间元素序号。
代码如下:
class Solution:
def binarySearchRecur(self, nums, target, low, high):
if low > high:
return low
mid = low + (high - low)/2
mid = int(mid)
if nums[mid] > target:
return self.binarySearchRecur(nums, target, low, int(mid-1))
elif nums[mid] < target:
return self.binarySearchRecur(nums, target, int(mid+1), high)
else:
return mid
def searchInsert(self, nums, target):
return self.binarySearchRecur(nums, target, 0, len(nums)-1)