链接: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;
}
我有以下疑问:
i
背后的直觉。我的意思是,为什么我们不返回j
。我在脑海里试了一下代码,但它确实有效,但我们怎么知道我们必须返回i
。 while (i<=j)
而只是while(i<j)
。我的意思是,我们如何确定这个?答案 0 :(得分:0)
据我所知,你在i == j时停止。因此,您可以返回其中任何一个,因为它们具有相同的值。
两个条件之间的差异是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)
以避免无限循环的情况。
P.S。如果字符串中没有'T'或者最后一个字符是'T',则此代码将返回n。不确定是否有意。