三种方法:
1 遍历直接寻找最小值
2 依据数组特性,最小值在最大值的后面
3 二分查找,定义low,high两个指针,还有mid指针,mid=low+(high-low)/2,如果array[low]小于array[mid],则最小值在array[mid] 后面,此时mid为low,相反,mid为high。如果最终high-low==0,最小值即为array[high].
#include <iostream>
#include <vector>
using namespace std;
class solution
{
public:
//遍历寻找最小值
int minNuberInRotateArray(vector<int> array) {
if (array.size() == 0) {
return 0;
}
int min = 0;
for (int i = 0; i < array.size(); i++){
if (array[i] < array[i + 1]){
min = array[i];
}
}
return min;
}
int minNuberInRotateArray2(vector<int> array) {
if (array.size() == 0) {
return 0;
}
int min = 0;
for (int i = 0; i < array.size(); i++) {
if (array[i] > array[i + 1]) {
min = array[i + 1];//最大值的后面
}
}
return min;
}
//二分法查找
int minNuberInRotateArray3(vector<int> array) {
if (array.size() == 0) {
return 0;
}
int mid = 0;
int low = 0;
int high = array.size() - 1;
if (array[low] < array[high]) {
cout << "没有旋转" << endl;
}
while (array[low] > array[high]) {
if (high - low == 1) {
mid = high;
cout << array[mid] << endl;
break;
}
else {
mid = (low + high)/2;
if (array[low] < array[mid]) {
low = mid;
}
else if (array[low] >= array[mid] ) {
high =mid;
}
}
}
return array[mid];
}
};
int main()
{
int a1[]={ 4, 5, 6, 2, 3};
vector<int> vec(a1, a1 + 5);
solution s;
cout << s.minNuberInRotateArray3(vec) << endl;
return 0;
}