题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:看起来挺好做的,但是复杂度为O(n);这题给出了排序数组,明显要用到这个条件。二分查找法复杂度为O(logn)。
非递减排序数组的旋转:
1 2 3 4 5 ====== 1 2 3 4 5 未发生旋转 array[low] < array[high]
1 2 3 4 5 ====== 3 4 5 1 2 发生旋转 array[low]>=array[high] 二分查找
0 1 1 1 1 ====== 1 1 1 0 1 ===== 1 0 1 1 1 array[low]==array[high]==array[mid] 顺序查找
class Solution {
public:
bool e_flag=false;
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.empty())
{
e_flag=true;
return 0;
}
int len=rotateArray.size();
if(rotateArray[0]<rotateArray[len-1])
return rotateArray[0];
if(rotateArray[0]==rotateArray[len-1] && rotateArray[0]==rotateArray[(len-1)>>1])
return *min_element(rotateArray.begin(),rotateArray.end());
int start=0,end=len-1,mid=0;
while(end-start>1)
{
mid=(end+start)>>1;
if(rotateArray[start]<=rotateArray[mid])
start=mid;
else
end=mid;
}
return rotateArray[end];
}
};
python
# -*- coding:utf-8 -*-# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.er_flag=False;
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray)==0:
er_flag=True
return 0
length=len(rotateArray)
start=0
end=length-1
mid=(start+end)>>1
if rotateArray[start]==rotateArray[mid] and rotateArray[start]==rotateArray[end]:
return min(rotateArray)
while end-start>1:
mid=(start+end)>>1
if rotateArray[mid]>=rotateArray[start]:
start=mid
else:
end=mid
return rotateArray[end]