我有一系列数字,比如nums [n]。我必须找到位置'i',使得nums [i]在所有小于关键的整数中最大。 nums已排序。我知道我可以使用线性搜索从i = 0到nums [i]> = key的位置。但我想更快地做到这一点,所以有人能告诉算法所需的二进制搜索吗?
示例:nums [] = {2,4,14,25}和key = 15。因此,我应该是2,因为14是小于15的所有其他整数中的最大整数。
答案 0 :(得分:3)
请记住,在普通的二进制搜索代码中,使用的低和高变量表示数组的索引,因此您可以轻松地知道位置。
首先要注意是否[0]> =键,因为应该至少有1个元素,而不是用于搜索它的键。
然后继续二进制搜索:取出中间元素,如果此元素是> = key,则丢弃其右边的所有元素,包括它。
但是如果是[mid] <
键,则丢弃它左边的所有元素(包括它),并取出现在找到的元素的最大值或此元素。
代码:
if(a[0]>=key)
print("Some error message");
int found=-1;
int low=0,high=n-1;
while(low<high)
{
int mid=(low+high)/2;
if(a[mid]>=key)
high=mid-1;
else
{
low=mid+1;
found=max(found,a[mid]);
}
}
现在您知道在此循环之后,low将等于高,因此打印(低)或打印(高)
答案 1 :(得分:3)
Wayne的方法是正确的,我对代码进行了一些修改。我的代码是用Java编写的。
当a&lt; = nums [mid]时,所有大于或等于key的数字都被丢弃,而high被分配到mid-1。所以当循环结束时,high是第一个小于key或-1的数字。 -1表示给定数组中的数字小于键。
public static int lessThan(int[] nums, int key){
if(nums == null || nums.length == 0) return -1;
int low = 0, high = nums.length -1;
while(low <= high){
int mid = (low + high) >> 1;
if(key <= nums[mid]){
high = mid - 1;
}else {
low = mid +1;
}
}
return high;
}