问题:把一个数组最开始的若干个元素搬到数组的末尾,被称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。假设给出的所有元素都大于0,若数组大小为0,则返回0。
思路:
1.既然是非递减数组,旋转后比如可以分为两段非递减数组,只要循环比较相邻的两个元素,当前一个大于后一个时,后者便是数组中的最小元素。
2.也可利用二分查找的原理进行查找。
具体代码:(C++)
1.简单方法:
calss Solution
{
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
if(rotateArray.size() ==0)
return 0;
for(int i=0;i<rotateArray.size() -1; ++i)
{
if(rotateArray[i] > rotateArray[i+1])
return rotateArray[i+1];
}
return rotateArray[0];
}
};
2.复杂的方法:
class Solution
{
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
int length = rotateArray.size();
if(length == 0)
return 0;
int left = 0;
int right = length -1;
int mid;
whilt(rotatyArray[left] >= rotateArray[right] ) //原数组是非递减的,旋转过后while条件必定成立
{
if(left == right -1)
return rotateArray[right];
mid = (left+right)/2;
if(rotateArray[left == rotateArray[mid] && rotateArray[mid] == rotateArray[right])
{
int min_num = rotateArray[left];
for(int i=left;i < right;i++)
min_num = rotateArray[i] < min_num ?rotateArray[i] : min_num;
return min_num;
}
if(rotateArray[left] <= rotateArray[mid]) //从left 到mid是非递减的,则最小数在mid与right之间
left = mid;
else
right = mid;
}
return rotateArray[left];
}
};