C++ 求局部最小值

文章介绍了如何在无序数组中寻找局部最小值的问题,特别是当数组相邻元素不相等时。通过应用二分法,算法首先检查中间元素,然后根据其与相邻元素的关系来缩小搜索范围,最终找到局部最小值。代码示例展示了具体的实现过程,强调了在某些边界情况下如何处理。
摘要由CSDN通过智能技术生成

局部最小值问题
给定一个无序数组,且该数组相邻位置元素不相等,求解其中一个局部最小值

所谓局部最小值,就是指一个元素比它左右两边的元素都小,那么它就是局部最小值
比如: 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};
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值