考虑到这个问题:峰值元素是一个大于相邻元素的元素。
给定一个输入数组,其中num[i]≠ num[i 1],找到一个peak元素并返回其索引。
该数组可以包含多个峰值,在那种情况下将索引返回到任何一个峰值都是精细的。
示例:Array=[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);
}
我不明白它是如何工作的——我以为二进制搜索只是用于排序数组/旋转数组。
如果有多个峰值,则不需要对数组进行排序。排序实际上会去除除一个峰值以外的所有峰值。
这个代码是如何工作的?想象一下,你在一条崎岖不平的路上,需要找到一座山峰——但你是盲人,所以你看不见它,只能凭感觉工作。你从某个点开始,根据你所处点的坡度,检查你是否必须向左或向右移动(你向左和向右移动一只脚,感觉你击中了什么)。然后你迈出一大步(你是神奇小姐,所以huuge steps对你来说不是问题),再次检查新位置的坡度。你重复这一步,减小步长,直到你到达一个点,左右都是下坡,所以你达到了一个峰值。
如果“峰值”的定义仅仅是它是一个比周围元素大的元素,那么你可以解释它为什么工作。
if (array[mid] > array[mid + 1]) {
return getPeakElement(array, left, mid);
}
return getPeakElement(array, mid + 1, right);
条件是:
随着递归的进行,您知道:
左-1
在数组之外,或者那里的元素小于arr[左]
处的元素(否则你不会选择这一半)right 1
在数组之外,或者那里的元素小于arr[right]
处的元素(否则你不会选择这一半)。你继续,直到↓==right
,这时你知道你已经到达了峰值,因为相邻的元素更少(或者你在数组的一端或另一端)。
(sharth的评论已经回答了这个问题。) 我已经用python编写了一个二进制搜索算法,它或多或少遵循与在bisect模块中找到的bisect_left函数相同的结构。事实上,它有几个较少的条件,因为我知道,高点是列表的长度,低点是0。然而由于某种原因,内置函数的运行速度是我的5倍。 我的代码如下: 内置函数的源代码是: 正如你所看到的,几乎完全相同。然而,my函数(在100000字的有序列表中
问题内容: 我的任务是创建一个方法,该方法将打印在排序数组中找到值x的所有索引。 我知道,如果我们仅从0到N(数组的长度)对数组进行扫描,则最坏情况下的运行时间为O(n)。由于将对传递给该方法的数组进行排序,因此我假设我可以利用二进制搜索的优势,因为这将是O(log n)。但是,这仅在数组具有唯一值的情况下有效。因为二进制搜索将在特定值的第一个“查找”之后完成。我当时正在考虑进行二进制搜索,以便在
我在看麻省理工学院的开放课件的第一次讲座,关于算法的介绍,有一些东西对我来说并不是很明显。你不能在这里观看24:30的讲座和课堂讲稿,这里有一维峰值问题的定义和解决方案的所有细节 问题是: 对于由“n”个整数元素组成的数组,找到一个峰值 我的问题/担心 既然在中有上述条件,为什么要往左走?而不是右边? 既然在中有上述条件,为什么要往右边走?而不是左边? 二进制搜索算法假设我们从排序的数组开始,那么
问题内容: 我有一个排序的数组,想要对它进行二进制搜索。 所以我想问一下Swift库中是否已有诸如sort等的东西?还是有类型独立版本可用? 当然,我可以自己编写它,但是我想避免再次发明轮子。 问题答案: 这是使用二进制搜索的通用方法:
我想输出给定值数组的二叉搜索树。它遵循二叉搜索树原理。图表向左旋转 这是所需的输出: 我该怎么修
我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。