假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组?[0,1,2,4,5,6,7]?可能变为?[4,5,6,7,0,1,2]?)。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回?-1?。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是?O(log?n) 级别。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先找到数组的中间点,数组肯定会被分成两部分,一部分是已经排序好的数组,另一部分仍然是旋转数组,然后递归查找。
class Solution:
def search(self, nums, target: int) -> int:
def find(head ,tail):
while head<=tail:
mid = (head+tail)//2
if nums[mid]<target:
head = mid+1
elif nums[mid]>target:
tail = mid-1
else:
return mid
return None
def find2(start,end):
if end-start<=2:
for i in range(start,end+1):
if nums[i] == target:
return i
return None
s0 = start
s1 = (start+end)//2
s2 = end
if nums[s1]<=nums[s0]:
res = find2(s0,s1-1)
if res is not None:
return res
if target< nums[s1] or target>nums[s2]:
pass
else:
return find(s1,s2)
pass
elif nums[s1]>=nums[s2]:
res = find2(s1+1,s2)
if res is not None:
return res
if target< nums[s0] or target>nums[s1]:
pass
else:
return find(s0,s1)
else:
if target< nums[start] or target>nums[end]:
return None
else:
return find(s0,s2)
t = find2(0,len(nums)-1)
return t if t is not None else -1
s= Solution()
print(s.search([4,5,6,7,0,1,2],4))
先二分查找到最小值,恢复序列,(旋转点一定是最小值)然后再二分查找
原文:https://www.cnblogs.com/Lzqayx/p/12153281.html