假設按照升序排序的數組在預先未知的某個點上進行了旋轉。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)