面试题11:旋转数组的最小数字原题链接
class Solution {
public:
int minArray(vector<int>& numbers) {
// 顺序搜索,O(n),没有考虑数组是有序数组旋转后得到的,不够优秀!
// 二分搜索,O(log n)
int n = numbers.size();
int index1 = 0, index2 = n-1;
int mid = index1; // 这样初始化的目的是使得旋转元素为0个时能够直接返回index为0的值
while(numbers[index1] >= numbers[index2]){
mid = (index1 + index2) / 2;
if(numbers[index1] == numbers[mid] && numbers[mid] == numbers[index2]){
// 考虑 1 0 1 1 1 和 1 1 1 0 1 两种情况
// 当mid的值和前后值都相同时无法知道最小值在前面还是后面
int minV = 99999999;
for(int i = index1;i <= index2; i++){
if(numbers[i] < minV)
minV = numbers[i];
}
return minV;
}
if(numbers[mid] >= numbers[index1]){ // 继续搜索后半部分
index1 = mid;
}
else if(numbers[mid] <= numbers[index2]){ // 继续搜索前半部分
index2 = mid;
}
if(index1+1 == index2){
mid = index2;
break;
}
}
return numbers[mid];
}
};