lintcode 75 Find Peak Element
Hi 大家,这道题是lintcode上的find peak element的题,不是leecode的那道,
这两道题是有区别的,这道题的题目中说明了:只有左右两侧的数都小于某个元素,这种才是峰值,
而leetcode的题,是只要找到个最大值就行,可以是[1,2]这种。
There is an integer array which has the following features:
- The numbers in adjacent positions are different.
- A[0] < A[1] && A[A.length - 2] > A[A.length - 1].
We define a position P is a peek if:
A[P] > A[P-1] && A[P] > A[P+1]
Find a peak element in this array. Return the index of the peak.
Example
Given [1, 2, 1, 3, 4, 5, 7, 6]
Return index 1
(which is number 2) or 6
(which is number 7)
分析:
你给出一个整数数组(size为n),其具有以下特点:
- 相邻位置的数字是不同的
- A[0] < A[1] 并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足A[P] > A[P-1]
且A[P] > A[P+1]
,返回数组中任意一个峰值的位置。
给出数组[1, 2, 1, 3, 4, 5, 7, 6]
返回1
, 即数值 2 所在位置, 或者6
, 即数值 7 所在位置.
要找峰值,要分析每个点有哪几种情况,每个只有四种情况,
(1)在某个峰值
(2)在某个上升区间
(3)在某个下降区间
(4)在一个谷底,比左右两边的元素都小。
首先我们可以确定的是,第一个元素和最后一个元素不可能构成一个峰值,因为峰值要求某个值要同时大于左右两侧的数。
限定了start和end的范围,这道题我们用二分法解决。
第三个条件选择里 else{ start = mid} 也可以是 end = mid。
class Solution {
/**
* @param A: An integers array.
* @return: return any of peek positions.
*/
public int findPeak(int[] A) {
int start = 1, end = A.length-2; // 1.答案在之间,2.不会出界
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(A[mid] < A[mid - 1]) {
end = mid;
} else if(A[mid] < A[mid + 1]) {
start = mid;
} else {
start = mid;
}
}
if(A[start] < A[end]) {
return end;
} else {
return start;
}
}
}
最新文章
- 用Unity模仿CSGO里的火焰效果
- QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView
- 第一个CUDA程序
- OSS研究
- asp.net中bin目录下的 dll.refresh文件
- 对原生js的一些小尝试
- 经典排序算法 - 高速排序Quick sort
- vs2012 网站无法使用自定义服务器的解决方法
- My ";Top 5 R Functions";(转)
- WindowUtils【窗口工具类】
- lambda expressions
- 2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践
- [UWP]使用Popup构建UWP Picker
- PYTHON-基本数据类型-元祖类型,字典类型,集合类型-练习
- MySQL免安装配置(亲测过,请放心借鉴)
- Tkernel Package NCollection哈希基础的类
- []如何在Windows 10中更改文件夹背景颜色
- javascript 获取视口的高度和宽度
- 学习MongoDB 三: MongoDB无法启动的解决方法
- 一款基于jquery固定于顶部的导航