【问题标题】:Find place for number in array using binary search使用二进制搜索在数组中查找数字的位置
【发布时间】:2012-11-07 20:02:32
【问题描述】:
我有一个数字数组,比如 nums[n] 。我必须找到位置 'i' 使得 nums[i] 在所有小于 key 的整数中最大。 nums 已排序。我知道我可以使用从 i=0 到 nums[i]>=key 位置的线性搜索来做到这一点。但我想更快地做到这一点,所以有人能告诉算法所需的二进制搜索吗?
示例:nums[]={2,4,14,25} 和 key=15。因此 i 应该是 2,因为 14 是所有其他小于 15 的整数中最大的整数。
【问题讨论】:
标签:
algorithm
binary-search
【解决方案1】:
请记住,在正常的二分搜索代码中,使用的低和高变量表示数组的索引,因此您很容易知道位置。
首先看看a[0]>=key,因为应该至少比key少1个元素才能搜索出来。
然后进行二分查找:取出中间元素,如果这个元素是>=key,则丢弃它右边的所有元素,包括它。
但是如果 a[mid] <key ,则丢弃它左边的所有元素(包括它)并取出到目前为止找到的元素或这个元素的最大值。
代码:
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 将等于 high 所以 print(low) 或 print(high)
【解决方案2】:
Wayne 的方法是正确的,我对代码做了一些修改。我的代码是用 Java 编写的。
当 a
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;
}