【问题标题】:Floor in a Sorted Array排序数组中的楼层
【发布时间】:2021-07-27 18:36:14
【问题描述】:

我有一个大小为n 的排序数组arr[] 没有重复,并给出了一个值x。 x 的层定义为arr[] 中的最大元素K,使得K 小于或等于x。找到K(0-based indexing)的索引。

输入:

n = 7
x = 0
arr[] = {1,2,8,10,11,12,19}

输出:

1

我必须在 O(logn) 中解决它。 我下面的代码通过了测试用例,但显示超出时间限制。这段代码有什么问题?

static int findFloor(long arr[], int n, long x) {
    int low = 0;
    int high = n - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] > x) {
            if (mid != 0 && arr[mid - 1] < x) {
                return mid;
            } else {
                high = mid - 1;
            }
        } else if (arr[mid] < x) {
            low = mid + 1;
        }
    }
    return -1;
}

【问题讨论】:

  • n=1, x=10, arr[]={10} 我认为这个(以及任何类似情况)将进入无限循环。
  • 当 arr[mid] == x 时你什么都不做。所以你进入无限循环。在您的 else if 条件中,将 arr[mid]
  • 但我的回答错了。

标签: java binary-search


【解决方案1】:

您的程序将在arr[mid] == x 的情况下陷入无限状态,因为您尚未处理此情况。此外,我认为该程序在其他情况下也无法正常工作。

例如,如果我给x=7,这将返回索引2,这是错误的。正确的索引应该是1,因为x=7 大于arr[1] == 2 并且小于arr[2] == 8。

此外,如果我输入的输入大于数组中的最后一个元素,例如您的示例中的x=50,您的代码将会中断。您将获得一个ArrayIndexOutOfBoundException,因为您的low 将增加并使mid 索引超出范围。

我已经纠正了上述情况,固定功能如下:

static int findFloor(long[] arr, int n, long x) {
    if (x >= arr[arr.length - 1]) {
        return arr.length - 1;
    }
    int low = 0;
    int high = n - 1;
    while (low <= high) {
        int mid = (low + high) / 2;
        if (arr[mid] > x) {
            if (mid != 0 && arr[mid - 1] < x) {
                return mid;
            } else {
                high = mid - 1;
            }
        } else {
            if (arr[mid] == x || (mid != 0 && arr[mid + 1] > x)) {
                return mid;
            } else {
                low = mid + 1;
            }
        }
    }
    return -1;
}

希望你能得到答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多