寻找波谷

在给定满足特定条件的数组中,利用二分查找法在O(logN)时间复杂度内找到一个波谷。分析了二分查找的逻辑,并提供了递归实现的代码思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

给定数组A[1...n],满足:n>=3, A[1]>=A[2],  A[n] >= A[n-1]。

若A[i]为波谷,则:A[i-1] >= A[i] <= A[i+1]。

请在O(logN)时间内,找到数组中的一个波谷。


分析:

根据数据数组的两端的情况,可知:整个区间必存在波谷。

要求O(logN),首先想到二分:

设区间为【left,right】,满足left>= left+1, right >= right-1。

设mid = (left + right) / 2。

那么:

1)若A[mid-1] < A[mid], 则【left,mid】必存在波谷。

2)若A[mid] <A[mid+1],则【mid,right】必存在波谷。

3)若1)、2)均不满足,则mid必为波谷。

故,很容易二分。


代码1:递归实现

int FindTrough(const vector<int> &v, int s, int t){
	int mid = (s + t) >> 1;
	if(v[mid -1] < v[mid])
		return FindTrough(v, s, mid);
	else if(v[mid] > v[mid + 1])
		return FindTrough(v, mid, t);
	return mid;
}

代码2:非递归实现

int FindTrough(const vector<int> &v){
	int left = 0, r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值