1.题目: 寻找峰值
描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,
在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] = -\infty?∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?
2.算法:
1.暴力算法
2.二分算法
3.算法思路
处于递增数列 就含有峰值
4.代码:
/*************************************************
作者:She001
时间:2022/10/9
题目: 寻找峰值
描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,
在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] = -\infty?∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?
***************************************************/
//算法:
//1.暴力算法:
//2.二分查找
#include<bits/stdc++.h>
using namespace std;
//二分查找 中间查找峰值 假如中间的mid 的值 是 是处于递增 数列 那么这里含有 峰值
//假如mid 处于 递减数列 那么没有 峰值
int fangfa_1(vector<int>&q)//动态数组q 引用
{
int left =0;
int right=q.size() -1;//右边数组最大的位置
while(left<right)
{
int mid=(left + right)/2;
//右边是往下的,不一定有峰值
if(q[mid]>q[mid+1])
{
right=mid;
}
//右边往上 ,一定能找到峰值
else
{
left=mid+1;
}
}
return right;
}
//暴力算法
//思路: 查找第一个 峰值 直接冲第一个元素开始遍历 一直递增,遇到递减 就可以 判定为峰值
int fengzhi(int num[],const int a,const int n)
{
for(int i=a;i<n-1;i++)
{
if(num[i]>num[i+1])
{
return i;
}
}
return -1;
}
int fangfa_2(int num[],const int n)//num 数组 n 数组元素个数
{
if(n<=1)
{
return -1;
}
for(int i=0;i<n;i++)
{
if(num[i]<num[i+1])
{
return fengzhi(num,i,n);
}
}
}
int main()
{
vector<int>q;//创建一个动态数组 , 一维数组
q.insert(q.end(),1);//在动态数组里面添加元素 添加的方法还有 q.push_back(int a) 直接在尾部添加元素
q.insert(q.end(),2);
q.insert(q.end(),3);
q.insert(q.end(),4);
q.insert(q.end(),3);
q.insert(q.end(),2);
q.insert(q.end(),1);
q.insert(q.end(),5);
q.insert(q.end(),6);
q.insert(q.end(),7);
q.insert(q.end(),8);
q.insert(q.end(),4);
q.insert(q.end(),3);
int b=fangfa_1(q);
cout<<"b= "<<b<<endl;
int num[10]={1,2,3,4,3,2,1,6,8,7};
int a=fangfa_2(num,10);
cout<<"a= "<<a<<endl;
return 0;
}