题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例:

输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

python代码

解法1:

class Solution:
def search(self, nums: List[int], target: int) -> int:
try:
return nums.index(target)
except:
return -1

解法2:
1.先判断哪边没有旋转;
2.在没有旋转的部分做判断,如果target是否在其中,在则缩小范围为该部分,不在则缩小范围到另一部分;
3.当high low 长度为2的时候跳出循环(不需要做mid+1的复杂难懂的技巧跳出循环);
4.比较high low 与target;
5.返回符合的值。

class Solution:
def search(self, nums: List[int], target: int) -> int:
n = len(nums)
if n == 0:
return -1
low = 0
high = n - 1
while low < high - 1:
mid = (low + high)//2
# The left is not rotated
if nums[low] < nums[mid]:
if target <= nums[mid] and target >= nums[low]:
high = mid
else:
low = mid
else:
if target <= nums[high] and target >= nums[mid]:
low = mid
else:
high = mid
if nums[high] == target:
return high
if nums[low] == target:
return low
return -1