九章算法--寻找数组波峰

本文介绍了一种使用二分法在包含波峰的数组中找到波峰的方法,即使数组中存在相邻相等的元素,算法也能确保在O(n)的时间复杂度内完成。

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

题目描述:一 个数组A[1..n],假设数组中没有任何相邻两数相等,满足A[1]<A[2],A[n-1]>A[n]。A[i]被称为波峰,当且仅当 A[i]>A[i-1]并且A[i]>A[i+1]。请找到数组中的一个波峰。假设数组中存在相邻相等的数,该怎么做?

二分法寻找一个波峰,

如果数组存在相邻相等的元素则必须O(n)

 1 /*************************************************************************
 2     > File Name: ArrayWaveCrest.cpp
 3     > Author: zhoukang1991
 4     > Mail: zhoukang199191@126.com 
 5     > Created Time: 2014年08月29日 星期五 21时36分24秒
 6  ************************************************************************/
 7 
 8 #include <iostream>
 9 #include <vector>
10 #include <climits>
11 using namespace std;
12 
13 int findcrest(const vector<int> &arr){
14     int left = 0;
15     int right = arr.size()-1;
16     int n = arr.size();
17     while(left <= right){
18         int mid = left + (right-left)>>1;
19         if(mid == 0){
20             left = 1;
21             continue;
22         }
23         if(mid == n-1){
24             right = n-2;
25             continue;
26         }
27 
28         if( arr[mid] > arr[mid-1] && arr[mid] > arr[mid+1]){
29             return arr[mid];
30         }
31         else if(arr[mid] < arr[mid-1]){
32             right = mid-1;
33         }
34         else{
35             left = mid+1;
36         }
37     }
38     return INT_MIN;
39 }
40 
41 int main(){
42     vector<int> v;
43     v.push_back(1);
44     v.push_back(2);
45     v.push_back(3);
46     v.push_back(2);
47     v.push_back(1);
48     cout<<findcrest(v)<<endl;
49     return 0;
50 }

 

转载于:https://www.cnblogs.com/cane/p/3944247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值