您的位置:首页 > 其它

寻找峰值 查看运行结果 ——LintCode

2015-12-16 14:25 253 查看
你给出一个整数数组(size为n),其具有以下特点:

相邻位置的数字是不同的
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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: