【问题标题】: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;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-08
        • 2019-09-12
        • 1970-01-01
        • 2021-12-20
        • 2019-11-17
        • 1970-01-01
        • 2013-05-22
        • 2015-08-03
        • 2019-07-15
        相关资源
        最近更新 更多