首先,将该问题的比特数组定义为对于长度为N的数组中的某些索引K,其中0 <0。 K&lt; N - 1和0到K是单调递增的整数序列,K到N - 1是单调递减的整数序列。
示例:[1,3,4,6,9,14,11,7,2,-4,-9]。它从1到14单调增加,然后从14减少到-9。
我担心的是我无法理解二元搜索在寻找比特序列中最大的元素。
答案 0 :(得分:2)
您基本上是在搜索位置 m ,以便项目增加到 m ,并从中开始减少。
regular binary search的修改可以解决这个问题。
您的搜索在 l 和 r 之间的每次迭代中进行,分别初始化为0和 n - 1 。
在每次迭代中,选择 m =⌊(l + r)/2⌋。检查 m 的左右邻居(除非 m = 0 或 m = n - 1 ,只检查一个邻居),并比较这三个要素。有三种情况:
左邻居较小而右邻居较小 - m 的元素是你想要的。
左邻居较小而右邻居较大 - 您需要向右搜索。
左邻居较大而右邻居较小 - 您需要向左搜索。
当您向左或向右移动时,您可以像通常的二分查找一样调整 l 和 r 。
终止与常规二进制搜索一样,但以下情况除外。请注意,如果它在您未找到右下邻居的位置终止,则答案位于 n - 1 ;如果它以找到左下邻居终止,则答案为0。
答案 1 :(得分:0)
返回给定的bitonic数组中最大元素的索引(首先是升序,然后是降序,没有重复):
private int findMax(int[] array, int low, int high) {
int mid = low + (high-low)/2;
if (high == low) return high; // max has be found
else if (array[mid] < array[mid+1]) {
return findMax(array, ++mid, high); // search in the right subarray
} else {
return findMax(array, low, mid); // search in the left subarray
}
}