75. 寻找峰值
来源:互联网 发布:java绝对值函数怎么用 编辑:程序博客网 时间:2024/05/16 11:52
题目描述
你给出一个整数数组(size为n),其具有以下特点:
相邻位置的数字是不同的
A[0] < A[1] 并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足A[P] > A[P-1]且A[P] > A[P+1],返回数组中任意一个峰值的位置。
注意事项
It’s guaranteed the array has at least one peak.
The array may contain multiple peeks, find any of them.
The array has at least 3 numbers in it.
样例
给出数组[1, 2, 1, 3, 4, 5, 7, 6]返回1, 即数值 2 所在位置, 或者6, 即数值 7 所在位置.
分析
任意选取数组中的一个元素A[n](n!=0&&n!=A.length-1),一共可能出现四种情况:
1 A[n-1]< A[n],A[n+1]>A[n],即A[n]处在一个递增序列中。此时大于n的位置中必存在峰值。
2.A[n-1]> A[n],A[n+1]< A[n],即A[n]处在一个递减序列中。此时小于n的位置中必存在峰值。
3.A[n-1]> A[n],A[n+1] >A[n],即A[n]处在一个“低谷”,分析题目给定的数组的条件可知此时n左右两边都存在峰值。
4. A[n-1]< A[n],A[n+1]< A [n],此时n即我们要找的峰值。
经过以上分析,便可以用二分法简单的寻找到一个峰值。
另外,若数组中存在n个“低谷”,就会有n+1个峰值,二分搜索的过程中每次碰到低谷,在代码中只选择了其左边或右边一种情况,因此只能找到一个峰值。不过这已经满足题目要求。
代码
public class Main { public static int findPeak(int[] A) { // write your code here int l = 0; int r = A.length-1; int mid; while (l+1<r){ mid = l+(r-l)/2; if (A[mid]>A[mid+1]&&A[mid]>A[mid-1]){ return mid; } //A[mid]处在递增区间 l=mid+1 if (A[mid]>A[mid-1]&&A[mid]<A[mid+1]){ l=mid+1; } //A[mid]处在递减区间 r=mid-1 if(A[mid]<A[mid-1]&&A[mid]>A[mid+1]){ r=mid-1; } if (A[mid]<A[mid+1]&&A[mid]<A[mid-1]){ l=mid+1; } } if (l>0&&A[l]>A[l+1]&&A[l]>A[l-1]){ return l; } if (r<A.length-1&&A[r]>A[r+1]&&A[r]>A[r-1]){ return r; } return -1; }}
- 75. 寻找峰值
- 寻找峰值
- 寻找峰值
- 寻找峰值
- 寻找峰值
- 寻找峰值
- 寻找峰值
- Matlab------------寻找峰值函数
- Matlab---寻找峰值函数
- findpeaks 寻找峰值函数
- LintCode-寻找峰值
- 题目:寻找峰值
- [LintCode]寻找峰值
- LintCode_75_寻找峰值
- 【Matlab】寻找峰值函数
- lintcode:寻找峰值
- LintCode 75 寻找峰值
- findpeaks 寻找峰值函数
- 无穷小微积分是ZFC大花园的一颗奇葩
- thinkphp 缩略图
- 初探JavaScript魅力(2)
- 混淆矩阵
- Java 中关于this、static、final 关键字的使用
- 75. 寻找峰值
- 机器学习和深度学习
- Kotlin使用简单总结
- java消息中间件
- 大数据,高并发环境下的数据问题解决
- 如何记忆Request范围和Request范围是怎么处理的?
- excel 追加内容
- 【Linux】crontab——定时执行任务,表达式编写
- Dom4j 存在命名空间导致document.selectNodes() 无返回结果