#!/usr/bin/python# -*- coding: utf-8 -*-'''
Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
'''#注意有序数组里面没有重复元素classSolution(object):defsearch(self, nums, target):"""
:type nums: List[int]
:type target: int
:rtype: int
"""
length = len(nums)
if length == 0:
return -1
left,right = 0,length - 1while left <= right:
mid = (left + right)/2if nums[mid] == target:
return mid
if nums[left] > nums[right]:#此时nums处于翻转状态if nums[mid] > nums[right]:#mid在较大的有序段中if nums[mid] < target: #target大于nums[mid],因为处在较大的有序段中,左侧的肯定比nums[mid]都小,所以只能往右找.
left = mid + 1else: #target小于nums[mid]if nums[left] == target:
return left
if nums[left] > target:#因为处在较大的有序段中,如果最小的元素都比target大的话,只能往右找
left = mid + 1else:
right = mid - 1else: #mid处于较小的一侧,同理可得以下if nums[mid] > target:
right = mid - 1else:
if nums[left] == target:
return left
if nums[left] > target:
left = mid + 1else:
right = mid - 1else:#未处于翻转if nums[mid] > target:
right = mid - 1else:
left = mid + 1return -1if __name__ == "__main__":
s = Solution()
print s.search([4,5,6,7,8,1,2,3],8)
版本2,只是整理了版本1的代码,但是不如版本1好理解
#!/usr/bin/python# -*- coding: utf-8 -*-'''
Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
'''#注意有序数组里面没有重复元素classSolution(object):defsearch(self, nums, target):"""
:type nums: List[int]
:type target: int
:rtype: int
"""
length = len(nums)
if length == 0:
return -1
left,right = 0,length - 1while left <= right:
mid = (left + right)/2if nums[mid] == target:
return mid
if nums[left] > nums[right]:#此时nums处于翻转状态if nums[mid] > nums[right] and nums[mid] < target:
left = mid + 1elif nums[mid] < nums[right] and nums[mid] > target:
right = mid - 1else:
if nums[left] == target:
return left
if nums[left] > target:
left = mid + 1else:
right = mid - 1else:#未处于翻转if nums[mid] > target:
right = mid - 1else:
left = mid + 1return -1if __name__ == "__main__":
s = Solution()
print s.search([4,5,6,7,8,1,2,3],8)