使用二进制搜索在数组中查找数字的位置
Posted
技术标签:
【中文标题】使用二进制搜索在数组中查找数字的位置【英文标题】: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 的整数中最大的整数。
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于使用二进制搜索在数组中查找数字的位置的主要内容,如果未能解决你的问题,请参考以下文章