假设按照升序排序的数组在预先未知的某个点上进行了旋转。python
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。算法
搜索一个给定的目标值,若是数组中存在这个目标值,则返回它的索引,不然返回 -1
。数组
你能够假设数组中不存在重复的元素。this
你的算法时间复杂度必须是 O(log n) 级别。code
示例 1:blog
输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4
示例 2:排序
输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1
这里须要解决的是序列的因为旋转所带来的问题索引
时间复杂度:O(log(n))ip
show me the codeutf-8
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @Author : Young @Email : hyc554@outlook.com @site : http://www.cnblogs.com/huang-yc/ @File : leet33.py @version : 1.0 @Time : 2019/4/16 19:33 Description about this file: """ class Solution: def search(self, nums, target): if not nums: return -1 low, high = 0, len(nums) - 1 while low <= high: mid = (low + high) // 2 if target == nums[mid]: return mid if nums[low] <= nums[mid]: # 当前全序列已是正序 if nums[low] <= target <= nums[mid]: # 目标值在最低值与中间值之间 high = mid - 1 # 最高索引变为中间值-1位 else: # 目标值在中间值与最高值之间 low = mid + 1 # 最低索引变为中间索引+1 else: # 当前序列存在反序列 if nums[mid] <= target <= nums[high]: # 目标值在中间值与最高值之间 low = mid + 1 # 最低索引变为中间值+1位 else: # 目标值在最低值与中间值之间 high = mid - 1 # 最高索引变为中间值-1位 return -1 if __name__ == '__main__': a = Solution() nums = [9,8,2,3,4,6,7] target = 3 b =a.search(nums,target) print(b)