【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] # 遍历完毕说明最小值就是第一个元素