"""
@Author: yanzx
@Date: 2020/7/25 13:59
@Description:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
"""
def search(nums, target):
try:
max_num = max(nums)
except:
return -1
index = nums.index(max_num)
new_nums = nums[index + 1:] + nums[:index + 1]
left = 0
length = len(new_nums)
right = length - 1
while left <= right:
mid = int((left + right) / 2)
if new_nums[mid] == target:
distance = length - 1 - mid
temp = index - distance
if temp >= 0:
return temp
else:
# 想象成为一个环
# return length - index + (index - distance) + index
return length + temp
elif new_nums[mid] < target:
left = mid + 1
elif new_nums[mid] > target:
right = mid - 1
return -1
if __name__ == '__main__':
res = search([4,5,6,7,0,1,2,3], 0)
print(res)
LeetCode 33. 搜索旋转排序数组
于 2020-07-25 16:01:25 首次发布