方法一:书上方法
class Solution {
public:
int minArray(vector<int>& numbers) {
int index1 = 0;
int index2 = numbers.size() - 1;
int indexMin = index1;
while( numbers[index1] >= numbers[index2])
{
if( index2 - index1 == 1 )
{
indexMin = index2;
break;
}
indexMin = ( index1 + index2 ) / 2;
if( numbers[index1] == numbers[index2] && numbers[index1] == numbers[indexMin] )
return InOrder_Min(numbers, index1, index2);
if( numbers[indexMin] >= numbers[index1] )
{
index1 = indexMin;
}
else if( numbers[indexMin] <= numbers[index2] )
{
index2 = indexMin;
}
}
return numbers[indexMin];
}
private:
int InOrder_Min(vector<int>& numbers, int index1, int index2)
{
int result = numbers[index1];
for(int i = index1 + 1; i <= index2; i++)
{
if(result > numbers[i])
result = numbers[i];
}
return result;
}
};
方法二:二分搜索
class Solution {
public int minArray(int[] numbers) {
int left = 0, right = numbers.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (numbers[mid] < numbers[right]) {
right = mid;
} else if (numbers[mid] > numbers[right]) {
left = mid + 1;
} else {
right -= 1;
}
}
return numbers[left];
}
}