【问题标题】:Binary Search Explanation二分查找说明
【发布时间】:2018-04-06 11:22:19
【问题描述】:

链接:https://leetcode.com/problems/first-bad-version/discuss/71386/An-clear-way-to-use-binary-search

我正在做一个问题,给定一个像“FFTTTT”这样的字符串,我必须找到最右边的F 或最左边的T

以下是代码:

To find the leftmost T

public int firstBadVersionLeft(int n) {
    int i = 1;
    int j = n;

    while (i < j) {

        int mid = i + (j - i) / 2;

        if (isBadVersion(mid)) {
            j = mid;
        } else {
            i = mid + 1;
        }

    }

    return i;

}

我有以下疑惑:

  1. 我无法理解返回i 背后的直觉。我的意思是,我们为什么不返回j。我在脑海中试运行了代码,它成功了,但我们怎么知道我们必须返回i
  2. 我们为什么不做while (i&lt;=j) 而只做while(i&lt;j)。我的意思是,我们如何确定这一点?

【问题讨论】:

  • 关于你的第一个问题:改为返回 j,看看有什么区别。
  • 关于你的第二个问题:如果while(i&lt;=j)全是Ts或Fs会发生什么?

标签: algorithm binary-search


【解决方案1】:
  1. 据我所知,您在 i==j 时停止。因此,您可以返回其中任何一个,因为它们具有相同的值。

  2. 这两个条件的区别是i == j。在那种情况下mid == i + 0/2 == i。所以 isBadVersion 可以返回 true 或 false。如果它返回 true,那么你执行 j=mid,但我们已经有了i == j == mid,所以你什么也不做,你有一个无限循环。如果 isBadVersion 返回 false 那么您将创建 i == j+1 并且循环将结束。由于边界是包容性的(它们包括第 i 个和第 j 个元素),因此只有在字符串中没有“T”时才会发生这种情况。 所以你做(i &lt; j) 来避免无限循环的情况。

附:如果字符串中没有“T”或最后一个字符是“T”,此代码将返回 n。不确定这是不是有意的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多