【问题标题】:Find the minimum index in an array such that some key is less than or equal to Array[index]查找数组中的最小索引,使得某个键小于或等于 Array[index]
【发布时间】:2020-06-18 22:39:23
【问题描述】:

我正在尝试稍微更改二进制搜索,因此我不想仅在元素在数组中时才找到元素的索引,而是要找到 Array[index] >= key.因此,如果我有一个像int A[5] = {1,5,10,15,20} 这样的数组并且我调用了search(A, 12, 5)(其中5 只是数组的长度),它将返回=> 3,因为A[3] = 15 >= 12。如果我搜索超过 20 的内容,它只会返回 5 或其他任意数字。

我试图将它写得尽可能接近传统的二分搜索。有什么帮助吗?

(这里是传统的二分查找)

int binarysearch(int A[], int key, int length) {
    int low = 0;
    int high = length - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (key < A[mid]) {
            high = mid - 1;
        } else if (key > A[mid]) {
            low = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}

【问题讨论】:

    标签: binary-search


    【解决方案1】:

    我认为最好的方法是在密钥小于中间条目时添加一个检查,该中间条目将查看前一个条目。如果键大于该条目,我们就有答案(因为如果您从列表中降级,则该条目不会大于该键)。所以,代码看起来像这样:

    int low = 0;
    int high = length - 1;
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (key < A[mid])
        {
            high = mid - 1;
            if (high < 0 || key > A[high])
            {
                return mid
            }    
        }
        else if (key > A[mid])
        {
            low = mid + 1;
        }
        else
        {
        return mid;
        }
    }
    return -1;
    

    如果您的列表允许重复,则需要更复杂,但否则它应该可以工作。

    【讨论】:

    【解决方案2】:

    不用return -1,直接返回mid

    【讨论】:

      猜你喜欢
      • 2014-12-20
      • 2020-12-23
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2015-05-25
      相关资源
      最近更新 更多