题目:
今天这题的暴力算法很好想,就是遍历。遍历整个数组找到最小值,或者排序,或者找到第一个升序数字,都行。
但是这题的二分查找是真的有意思:
首先,二分查找法在这里能应用的最关键因素是,旋转数组只被分成了两个部分,本质上是找到那个分离点。
如果mid的值大于right的值,说明在右区间。
否则,分离点在左区间。
遇到mid的值和right的值相等时,则right左移。
LC视频题解讲解的非常好,我这里就不再多赘述了。
C++代码附带测试:
#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
//class Solution {//暴力搜索
//public:
// int minArray(vector<int>& numbers) {
// //找到第一个递增的数字
// int i = 1;
// while(i<numbers.size() && numbers[i-1]<=numbers[i]){
// i++;
// }
// if(i>numbers.size()-1){
// return numbers[0];
// }else{
// return numbers[i];
// }
// }
//};
class Solution {
public:
int minArray(vector<int>& numbers) {//二分查找法
int right = numbers.size()-1;
int left = 0;
if(right==0){
return numbers[0];
}
while(left<right){
int mid = left + (right-left)/2;
if(numbers[mid] > numbers[right]){
left = mid + 1;
}else if(numbers[mid]==numbers[right]){//防止重复
right--;
}else if(numbers[mid]< numbers[right]){
right = mid;
}
}
return numbers[left];
}
};
int main(){
vector<int> numbers = {3,1};
Solution solution;
cout<<solution.minArray(numbers)<<endl;
}