【LeetCode每天一题】Find Minimum in Rotated Sorted Array(旋转数组中最小的值)

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.

Example 1:

Input: [3,4,5,1,2] 
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

思路

  旋转数组的定义如上面所示,我们需要在里面找到最小的数字。最简单的方法就是使用遍历的办法。从头开始遍历数字,当遇到一个当前数字比前一个数字小的时候,该数组就是最小的数字。这种解法的时间复杂度为O(n),空间复杂度为O(1)。另外,我们还可以利用二分查找算法来解决,每次将查找的返回缩小一半,直到最后找到数字。返回结果。时间复杂度为O(log n),空间复杂度为O(1)。
解决代码

  二分查找解法
 1 class Solution(object):
 2     def findMin(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: int
 6         """
 7         left, right = 0, len(nums)-1   # 头尾指针
 8         while left <= right:           
 9             if nums[left] <= nums[right]:    
10                 return nums[left]
11             mid = (left+right) // 2        # 取中间值
12             if nums[left] > nums[mid]:    # 如果左边值大于中间值,则说明最小值可能是mid或者在mid前面。
13                 right = mid
14             else:                         # 否则最小值在mid的后面部分,缩小左边的查找范围
16                 left = mid +1

  遍历解法

 1 class Solution(object):
 2     def findMin(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: int
 6         """
 7         if not nums:
 8             return nums
 9         for i in range(1, len(nums)): # 从第一个开始遍历
10             if nums[i] < nums[i-1]:     # 如果当前元素小于前一个元素,则说明是最小值,直接返回结果
11                 return nums[i]    
12         return nums[0]                  #  遍历完毕说明最小值就是第一个元素
posted @ 2019-06-06 10:06  GoodRnne  阅读(146)  评论(0编辑  收藏  举报