给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
为 无重复元素 的 升序 排列数组-104 <= target <= 104
思路:一看到题目很直观的思路,就是遍历一遍数组,因为给定的数组已经是升序排序好的,还没有重复的元素,因此只要遍历到比target大的或相等的元素,该元素下标就是我们要的。但题目要求说请必须使用时间复杂度为
O(log n)
的算法。遍历一次数组的时间复杂度为O(n),所以我们需要用更快捷的方法。
有序,插入/查找,这些字眼一出现我们就可以考虑是否可以采用二分法来解题,首先,i=0,j=len(nums)-1,在i<=j的情况下找是否数组中出现了target,出现了那我们返回对应的下标即可,否则我们就需要插入这个元素,插入的位置是i,那么为什么是i呢,用例子来看一下。
例2:
输入: nums = [1,3,5,6], target = 2 输出: 1① i = 0,j = 3,mid = (0 + 3) / 2 = 1,nums[1] = 3 > 2 故 j = mid - 1 = 0
② i = 0,j = 0,mid = (0 + 0) / 2 = 0,nums[0] = 1 < 2 故 i = mid + 1 = 1
此时 i > j 退出循环 i = 1就是我们要插入的下标位置。
代码(Python):
class Solution(object):
def searchInsert(self, nums, target):
i = 0
j = len(nums) - 1
while i <= j:
mid = (i + j) / 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
j = mid - 1
else:
i = mid + 1
if i > j:
return i