题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
python代码:
1 直接使用min函数
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if rotateArray is None:
return 0
return min(rotateArray)
2 使用sort函数排序
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if rotateArray is None:
return 0
else:
rotateArray.sort()
return rotateArray[0]
注:sorted()可用于任意可迭代对象,sort()一般作用于列表;sorted()返回排序后的列表,原列表不变,sort()直接修改原有列表。
3 遍历数组元素,当首次遇到数组中某个元素比上一个元素小时,该元素就是我们需要的元素。时间复杂度O(n).
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if rotateArray is None:
return 0
num = rotateArray[0]
for i in range(1, len(rotateArray)): #遍历,当首次遇到数组中某个元素比上一个元素小时,该元素就是我们需要的元素。
if rotateArray[i] >= num:
num = rotateArray[i]
else:
return rotateArray[i]
4 旋转数组也是一种排序数组,可使用二分法解题。时间复杂度O(logn).
递归方法,用变量mid定位数组的中间位置,将数组头部的值与mid处的值比较,不断缩小数组。
- 当缩小到最小的数组大小为2,数组中第一个元素为数组中值最大的元素,第二个元素是数组中值最小的元素,返回第二个元素;
- 当数组包含重复元素,即mid处的值等于数组头部的值时,无法判断最小值位于mid左侧还是右侧,此时采取遍历的方式。
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if rotateArray is None:
return 0
if len(rotateArray) == 2:
return rotateArray[1]
mid = len(rotateArray)/2
if rotateArray[mid] > rotateArray[0]:
return self.minNumberInRotateArray(rotateArray[mid:])
elif rotateArray[mid] < rotateArray[0]:
return self.minNumberInRotateArray(rotateArray[:mid+1])
else:
return self.minNumberInRotateArray(rotateArray[1:])
5 非递归实现
- rotateArray[mid] > rotateArray[right]:说明旋转后最小值在右区间
- rotateArray[mid] < rotateArray[right]:说明旋转后最小值在左区间
- 若无法判断中间的数字是位于前面的子数组还是后面的子数组时,需要遍历查找。
class Solution:
def minNumberInRotateArray(self, rotateArray):
left = 0
right = len(rotateArray)-1
while left < right:
mid = (left+right)/2
if rotateArray[mid] > rotateArray[right]:
left = mid+1
elif rotateArray[mid] < rotateArray[right]:
right = mid
else:
right -= 1
return rotateArray[left]