1.题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
2.Code
二分:具体看代码很好理解。注意一点,当arr[left]、arr[right]、arr[mid]都相等的时候,只能顺序查找。
因为二分会跳过最小值,如下图的例子。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int size = rotateArray.size();
if(size == 0) return 0;
int left = 0;
int right = size - 1;
int mid;
while(left < right){
if(right - left == 1){
return rotateArray[right];
}
mid = left + (right-left)/2;
//特殊情况处理
if(rotateArray[left] == rotateArray[right] && rotateArray[mid] == rotateArray[left])
{
int res = rotateArray[left];
for(int i = left+1; i < right; ++i){
if(rotateArray[i] < res)
res = rotateArray[i];
}
return res;
}
if(rotateArray[left] <= rotateArray[mid])
{
left = mid;
}
else if(rotateArray[right] >= rotateArray[mid]){
right = mid;
}
}
return rotateArray[mid];
}
};