假设一个排好序的数组在其某一未知点发生了旋转(比如0 1 2 4 5 6 7
可能变成4 5 6 7 0 1 2
)。你需要找到其中最小的元素。
样例
Example 1:
输入:[4, 5, 6, 7, 0, 1, 2]
输出:0
解释:
数组中的最小值为0
Example 2:
输入:[2,1]
输出:1
解释:
数组中的最小值为1
刚开始时我想到这是编程珠玑里面的一种思想,然后我就想了个笨办法,循环比较,只要增减性变了
便是最小的。但其实最后的办法时二分法,这对于一个有序数组来说是最好的
#include<iostream>
#include<vector>
using namespace std;
//这是我的
int findMin(vector<int> &a)
{
auto be = a.begin();
auto en = a.end();
if (a.size() == 1)
return a[0];
if (a[0]>a[1])
while (be != en-1)
{
if ((*be) > *(be + 1))
{
be++;
if (be == en - 1)
return a[a.size()-1];
}
else
{
return *(be + 1);
}
}
else
while (be != en-1)
{
if ((*be) <*(be + 1))
{
be++;
if (be == en - 1)
return a[0];
}
else
{
return *(be + 1);
}
}
}
//这是二分
int findMin1(vector<int> &a)
{
int left = 0;
int right = a.size() - 1;
int trage = a[right];
while (left < right)
{
int middle = (left + right) / 2;
if (a[middle]>trage)
{
left = middle + 1;
right = right;
}
else
{
left = left;
right = middle;//中间这个数也可能最小
}
}
return a[left];
}
int main()
{
vector<int> a{ 4, 5, 6, 7, 0, 1, 2 };
cout << findMin1(a);
system("pause");
return 0;
}