前言:这道题是变形的二分查找
我的答案
def search(nums, target):
l = len(nums)
left = 0
right = l - 1
if not nums:
return -1
if left == right:
if target == nums[left]:
return left
else:
return -1
while left < right:
mid = (right + left) // 2
if nums[mid] == target:
return mid
if right - left == 1:
if nums[right] == target:
return right
else:
return -1
if nums[left] < nums[mid]:
if (target > nums[mid]) or target < nums[left]:
left = mid
else:
right = mid
else:
if (target < nums[mid]) or (target > nums[right]):
right = mid
else:
left = mid
return -1
···
结果:
执行用时:32ms , 在所有 Python提交中击败了5.96 % 的用户
内存消耗: 13.2MB , 在所有Python 提交中击败了42.79 %的用户
结论:
执行时间有待优化
错误记录:
# 1.没考虑到的情况,二分法时将数组一分为二后两个独立的数组都是有序的,而且默认右边的数组里的数字都大于左边的数组,所以只要拿target和其中一个数组的头或者尾比较
#就知道这个数在不在这个数组里:
if target == nums[mid]:
# 找到了,可以直接return
if target < nums[mid]:
# 在左边的数组
else:
# 在右边的数组
但是这个题目中一个数组是有序的,一个数组无序的,无序的那个无法判断,只能拿有序数组来判断,只有目标数值target小于有序数组的头且大于有序数组的尾,
才能说这个tartet不在这个数组里,而另外一个数组是由原本数组的最大和最小值组成的,所以另外一个数组里的数可能大于这个数组里的数也有可能小于这个数组里的数
所以无法判断
2.mid的值 应该是 (头位置+尾位置)//2 而不是(头位置-尾位置)//2
解读是头和尾的平均值,不是头和尾差距的平均值
3.在while循环中有些量是每轮要变化的,比如这里的if nums[left] < nums[mid]: 判断条件不能写成if nums[0] < nums[mid]:
需要考虑第二轮的情况
4.nums 长度为l,最后一位不是nums[l]而是nums[l-1]
5.因为涉及将数组一分为二的情况,所以 需要考虑边界情况 当数组长度为0/1/2/3/4时