寻找峰值 查看运行结果 ——LintCode
2015-12-16 14:25
253 查看
你给出一个整数数组(size为n),其具有以下特点:
相邻位置的数字是不同的
A[0] < A[1] 并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组
即数值 2 所在位置, 或者
注意
数组可能包含多个峰值,只需找到其中的任何一个即可
******************************************************************
遍历一边 就可以O(n)
*****************************************
可以用二分法优化
首先我们的目标是找到中间节点mid, 1.如果大于两边的数字那么就是找到了答案,直接返回找到的答案。 2. 如果左边的节点比mid大,那么我们可以继续在左半区间查找,因为左边可以证明一定存在一个peak
element, 为什么呢?因为题目告诉了我们区间[0, mid - 1] 中num[0] < num[1],我们刚才又知道num[mid - 1]>num[mid]了,所以[0, mid - 1] 之间肯定有一个peak element。 3. 如果num[mid - 2] > num[mid - 1],那么我们就继续在[0, mid - 2]区间查找,那么同理可以在右边的区间找到一个peak element。所以继续这个二分搜索的方式最后我们就能找到一个peak element。
相邻位置的数字是不同的
A[0] < A[1] 并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足
A[P] > A[P-1]且
A[P] > A[P+1],返回数组中任意一个峰值的位置。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组
[1, 2, 1, 3, 4, 5, 7, 6]返回
1,
即数值 2 所在位置, 或者
6, 即数值 7 所在位置.
注意
数组可能包含多个峰值,只需找到其中的任何一个即可
******************************************************************
遍历一边 就可以O(n)
class Solution { /** * @param A: An integers array. * @return: return any of peek positions. */ public int findPeak(int[] A) { // write your code here if(A.length == 0) return 0; if(A.length == 1) return A[0]; if(A.length == 2) return 0; for(int i=1;i<A.length-1;i++) if(A[i] > A[i-1] && A[i] > A[i+1]) return i; return 0; } }
*****************************************
可以用二分法优化
首先我们的目标是找到中间节点mid, 1.如果大于两边的数字那么就是找到了答案,直接返回找到的答案。 2. 如果左边的节点比mid大,那么我们可以继续在左半区间查找,因为左边可以证明一定存在一个peak
element, 为什么呢?因为题目告诉了我们区间[0, mid - 1] 中num[0] < num[1],我们刚才又知道num[mid - 1]>num[mid]了,所以[0, mid - 1] 之间肯定有一个peak element。 3. 如果num[mid - 2] > num[mid - 1],那么我们就继续在[0, mid - 2]区间查找,那么同理可以在右边的区间找到一个peak element。所以继续这个二分搜索的方式最后我们就能找到一个peak element。
class Solution { /** * @param A: An integers array. * @return: return any of peek positions. */ public int findPeak(int[] A) { // write your code here int start = 1, end = A.length-2; while(start + 1 < end) { int mid = (start + end) / 2; if(A[mid] < A[mid - 1]) { end = mid; } else if(A[mid] < A[mid + 1]) { start = mid; } else { end = mid; } } if(A[start] < A[end]) { return end; } else { return start; } } }
相关文章推荐
- shell的foreach 函数
- 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定
- 成人高考专升本《生态学基础》章节复习题
- 短信加密机制的设计模式
- GitHub 优秀的 Android 开源项目
- Ubuntu:Android编译环境设置和编译
- Raphael的text及对齐方式
- java hashcode
- 基本排序算法——选择,插入,冒泡
- Visual Studio 2015更改背景与背景图
- postgresql 数据导出和导入
- SQL语句获取数据库中的表主键,自增列,所有列
- cisco 5508无线控制器 高可用性(SSO)部署指南
- [转载]offsetof与container_of宏
- android集成支付,支付宝,微信
- OpenStack Liberty版本里如何配置基于haproxy的负载均衡服务(LBaaS)
- UI12-uiPickerView
- 如何用th:attr标签在thymeleaf模板中设置属性-原标题:How To Set Attributes in Thymeleaf Template using th:attr?
- codeforce B. Preparing Olympiad (DFS+回溯)/(暴力状压)
- oracle的主要进程