二分查找算法以及旋转之后的数组二分查找算法:
#!/usr/local/bin/python3 # -*- coding: utf-8 -*- __author__ = 'author' class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ return self.sorted_binary_search(nums, 0, len(nums) - 1, target) #二分查找算法 def binary_search(self, nums, start, end, targrt): if start > end: return -1 mid = start + (end - start)//2 if nums[mid] > targrt: return self.binary_search(nums, start, mid - 1, targrt) elif nums[mid] < targrt: return self.binary_search(nums, mid + 1, end, targrt) else: return mid #旋转数组的折半查找算法 ''' 要解决这道题,需要明确rotated sorted array的特性, 那么就是至少有一侧是排好序的(无论pivot在哪,自己画看看)。 接下来就只需要按照这个特性继续写下去就好。 如果target比A[mid]值要小 如果A[mid]右边有序(A[mid]<A[high]) 那么target肯定不在右边(target比右边的都得小),在左边找 如果A[mid]左边有序 那么比较target和A[low],如果target比A[low]还要小, 证明target不在这一区,去右边找;反之,左边找。 如果target比A[mid]值要大 如果A[mid]左边有序(A[mid]>A[low]) 那么target肯定不在左边(target比左边的都得大),在右边找 如果A[mid]右边有序 那么比较target和A[high],如果target比A[high]还要大, 证明target不在这一区,去左边找;反之,右边找。 ''' def sorted_binary_search(self, nums, start, end, targrt): if start > end: return -1 mid = start + (end - start)//2 if targrt == nums[mid]: return mid if nums[start] <= nums[mid]: #如果左侧有序 if nums[start] <= targrt and targrt <= nums[mid]: #如果target在左侧中 return self.sorted_binary_search(nums, start, mid - 1, targrt) else: return self.sorted_binary_search(nums, mid + 1, end, targrt) else: #如果右侧有序 if nums[mid] <= targrt and targrt <= nums[end]: #如果target在右侧中 return self.sorted_binary_search(nums, mid + 1, end, targrt) else: return self.sorted_binary_search(nums, start, mid - 1, targrt) if __name__ == '__main__': s = Solution() print(s.binary_search([1,2,3,4,5,6,7,8,9], 0, 8, 9))
代码中注释参考了:http://www.cnblogs.com/springfor/p/3858140.html , 该博客中的算法描述比较易懂