典型的二分查找类型,此题需要注意的是结束条件
因题目要求输出最小数,则每次得到中间值后,判断该中间值左右相邻(注意左右的边界情况)的两数是否均大于该中间值,
若均大于,则该中间值即为最小值,
若不满足,继续进行二分查找,在这个过程中,需要判断最小点出现哪一边,也即乱序的一边包含最小值
代码
class Solution {
public:
int findMin(vector<int> &num) {
int left = 0;
int right = num.size()-1;
while(left<=right)
{
int mid = (left+right)/2;
bool leftFlag = true;
bool rightFlag = true;
if((mid-1)>=left)
{
if(num[mid-1]-num[mid]<0)
leftFlag = false;
}
if((mid+1)<=right)
{
if(num[mid+1]-num[mid]<0)
rightFlag = false;
}
if(leftFlag&&rightFlag)
return num[mid];
if(num[mid] < num[right])
right = mid - 1;
else
left = mid + 1;
}
}
};