【发布时间】:2018-06-28 16:59:46
【问题描述】:
鉴于这个问题: 峰值元素是大于其邻居的元素。
给定一个输入数组,其中 num[i] ≠ num[i+1],找到一个峰值元素并返回它的索引。
数组可能包含多个峰,在这种情况下,将索引返回到任何一个峰都可以。
示例:数组 = [1, 4, 5, 7, 4, 3, 1]。峰值指数 = 3(即 7)。
以下代码完美运行(不仅适用于这个测试用例):
public static int getPeakElement(int[] array, int left, int right) {
if (left == right) {
return left;
}
int mid = (left + right) / 2;
if (array[mid] > array[mid + 1]) {
return getPeakElement(array, left, mid);
}
return getPeakElement(array, mid + 1, right);
}
我不明白它是如何工作的 - 我认为二进制搜索仅适用于排序数组/旋转数组。
【问题讨论】:
-
可能是因为峰值恰好在中间。尝试交换,比如 5 和 7,它不会再起作用了。
-
你得到正确的结果只是一个巧合。尝试像
1, 4, 5, 4, 1, 3, 7这样的数组,你会得到索引 2 而不是 6。 -
@Thomas index 2 在这种情况下是正确的,因为
5是一个的峰值。 -
@luk2302 我明白了,但它不再是二分搜索了(至少不是那种能找到特定元素的排序)。因此,在 OP 方面,这可能更像是对代码的用途的误解。
-
我认为它起作用只是因为你必须找到一个峰值,而不是最大的峰值。
标签: java arrays recursion binary-search