leetcode第153题,二分查找,但是不是简单的二分,由于数组经过了所谓的旋转操作,因此整体上表现为无序。
其实第一反应就是挨个查找,在线性复杂度情况下寻找断口,由于断口一定出现在后面数比前面的一个数小的位置,因此扫一遍就能得出答案。
不过仔细观察可以发现,虽然整体无序,但是在旋转点的前后两个子数组都是有序的,能不能用二分查找进一步降低复杂度到logN呢?
题目要求是寻找最小的那个元素,这个元素一定会出现在一个有序数组的最开头,也就是断口的地方。可以按照二分的思路,每次讲中间值与数组的最后一个数据作比较,如果大于最后一个数,说明小数据的那一段应该出现在了后半部,左指针右移。如果小于,则说明小数据那一段还在前半部,右指针左移。如此下去就可以找到最小值了。
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
l = 0
r = n-1
while l <= r:
mid = l+(r-l)/2
if nums[mid] > nums[n-1]:
l = mid+1
else:
r = mid-1
return nums[l]