二进制搜索说明

时间:2018-04-06 11:22:20

标签: algorithm binary-search

链接: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<=j)而只是while(i<j)。我的意思是,我们如何确定这个?

1 个答案:

答案 0 :(得分:0)

  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 < j)以避免无限循环的情况。

  3. P.S。如果字符串中没有'T'或者最后一个字符是'T',则此代码将返回n。不确定是否有意。