局部最小值问题
给定一个无序数组,且该数组相邻位置元素不相等,求解其中一个局部最小值
所谓局部最小值,就是指一个元素比它左右两边的元素都小,那么它就是局部最小值
比如: 2,1,3 其中 1就是局部最小值
或者边界情况 1,2,0 其中1和0都是局部最小值
我们使用二分法的原因是,在求解的过程中,我们只用找一边一定存在局部最小值的,另一边可以舍弃
比如说:2,1,4,5,6
nums[mid] = 4, 先判断4是不是局部最小值,不是,那我们接着判断,它比右边的5要小,那说明在4的左边是递减的,并且2 > 1 说明4往左和2往右都是递减的,那么必然存在一个局部最小值
vector<int> findLocalMinimum(vector<int>& nums)
{
int len = nums.size();
int left = -1;
int right = len;
//只有一个元素的情况 和 第0个元素小于第1个元素的情况
if (size(nums) == 1||nums[0] < nums[1])
{
return vector<int>{nums[0]};
}
//最后一个元素小于倒数第二个元素的情况
if (nums[len - 1] < nums[len - 2])
{
return vector<int>{nums[len - 1]};
}
while(right - left != 1)
{
int mid = (left + right) / 2;
//每次都判断一下mid是否为局部最小值
if (nums[mid] < nums[mid + 1] && nums[mid] < nums[mid - 1])
{
return vector<int>{mid};
}
//如果mid比右边大,那就说明mid右边一定存在局部最小
if(nums[mid]>nums[mid+1])
{
left = mid;
}
else
{
right = mid;
}
}
//本来天真的以为不存在局部最小就返回-1的,但实际上是,只要数组满足条件,那么就一定存在局部最小值
// return vector<int>{-1};
}