写法1:遍历
时间复杂度:O(n)O(n)O(n)
写法2: 二分查找
时间复杂度:O(logn)O(log n)O(logn)
int MinInOrder(vector<int>& numbers, int left, int right){
//顺序查找[left, right)中的最小值
int res = numbers[left];
for(int i= left+1; i<=right; i++){
if(res>numbers[i]) res = numbers[i];
}
return res;
}
int minArray(vector<int>& numbers) {
int left = 0;
int right = numbers.size()-1;
int mid;
if(numbers[left]<numbers[right]) return numbers[0]; //特殊情况1: 已排序,最小值为numbers[0]
while(numbers[left]>=numbers[right]){
if(right-left==1){ //特殊情况2: right-left=1 参见样例[3,5,1,2]
return min(numbers[left], numbers[right]);
}
mid = (left+right)/2;
//特殊情况3 : 参见样例:[1,0,1,1,1]
if(numbers[left]==numbers[right]&&numbers[left]==numbers[mid]) return MinInOrder(numbers, left, right);
else if(numbers[mid]>=numbers[left]) left=mid;
else if(numbers[mid]<=numbers[right]) right=mid;
}
return numbers[mid];
}
写法3:二分查找,减少特例
int minArray(vector<int>& numbers) {
int left = 0;
int right = numbers.size()-1;
int mid;
if(numbers[left]<numbers[right]) return numbers[0];
while(left<right){
mid=(left+right)/2;
if(numbers[mid]>numbers[right]) left=mid+1;
else if(numbers[mid]<numbers[right]) right=mid;
else right--;
}
return numbers[left];
}