LeetCode 153. Find Minimum in Rotated Sorted Array 20170706

本文介绍了一种在已知无重复元素的升序旋转数组中查找最小元素的方法。首先通过一次遍历来找到数组中的转折点,即最小值所在。接着采用更高效的二分查找策略,将时间复杂度从O(n)降低到O(log n)。

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:])

 

 

转载于:https://www.cnblogs.com/fangdai/p/7126990.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值