33. Search in Rotated Sorted Array leetcode python 2016 new season

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.

1. find the pivot

2. do binary search in each part

if it is on the right side the index needs to be right_result + pivot

class Solution(object):
    def findPivot(self, nums):
        low = 0
        high = len(nums) - 1
        while low < high and nums[low] > nums[high]:
            mid = low + (high - low) / 2
            if nums[mid] < nums[high]:
                high = mid 
            else:
                low += 1
        return low
    def binSearch(self, nums, target):
        low = 0
        high = len(nums) - 1
        while True:
            if low > high:
                return -1
            mid = low + (high - low) / 2
            if target < nums[mid]:
                high = mid - 1
            elif target > nums[mid]:
                low = mid + 1
            else:
                return mid
                
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums) == 1 and nums[0] != target:
            return -1
        elif len(nums) == 1 and nums[0] == target:
            return 0
        pivot = self.findPivot(nums)
        left_result = self.binSearch(nums[:pivot], target)
        right_result = self.binSearch(nums[pivot:], target)
        if right_result != -1:
            right_result += pivot
        return max(left_result, right_result)
        


你可能感兴趣的:(33. Search in Rotated Sorted Array leetcode python 2016 new season)