代码改变世界

LeetCode 153. Find Minimum in Rotated Sorted Array 20170706

2017-07-06 16:25  方小呆dai  阅读(173)  评论(0编辑  收藏  举报

Suppose an array sorted in ascending order 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).

Find the minimum element.

You may assume no duplicate exists in the array.

题目大意:一个有序数组可能以某个数为轴调换顺序,请找出最小值。

解题思路:一开始最直观的想法是,遍历整个数组,如果碰到某个数比他的前一个数要小的话,该数就是最小值。如果遍历完整个数组都没有出现这种情况的话,那么数组的第一个数就是最小值。该算法的时间复杂度是O(n)。实现该算法后,为了提升算法的时间复杂度,发现可以直接用二分法搜索最小值,时间复杂度只需要O(logn)。

class Solution(object):
  def findMin(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    res = 0
    sign = 0
    if len(nums)==0:
      return;
    if len(nums)==1:
      return nums[0];
    for i in range(1,len(nums)):
      if nums[i]<nums[i-1]:
        res=nums[i]
        sign=1
        break
    if sign==0:
      return nums[0]
    return res

二分法

 

 

class Solution(object):
  def findMin(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    if len(nums) == 1:
      return nums[0]
    if len(nums) == 2:
      return min(nums[0],nums[1])
    mid = len(nums)/ 2
    if nums[mid - 1] > nums[mid]:
      return nums[mid]
    if nums[mid] < nums[-1]:
      return self.findMin(nums[:mid + 1])
    return self.findMin(nums[mid:])