【发布时间】:2016-10-21 05:41:30
【问题描述】:
我很难理解如何增加低或高。
例如,这是一个来自 leetcode 的问题:
实现 int sqrt(int x)。
我的代码:
class Solution {
public:
int mySqrt(int x) {
if (x<=0) return 0;
int low=1, high=x, mid=0;
while (low<=high){ // should I do low<high?
mid=low+(high-low)/2;
if (x/mid==mid) return mid;
if (x/mid>mid) low= mid+1; //can I just do low=mid?
else high=mid-1; // can I do high =mid?
}
return high; //after breaking the loop, should I return high or low?
}
};
你看,一个条件满足后,我不知道该设置low=mid还是low=mid+1。为什么是mid+1?
一般来说,我很难确定是否应该从中点低点增加。我什么时候应该在while 循环中包含low <= high 或low < high 也遇到了麻烦。
【问题讨论】:
-
if (x/mid==mid) 返回中值;在这里,您检查 mid 作为平方根,如果是,则从这里返回。所以我们倾向于不再检查它。所以我们做低=中+1和高=中-1
-
而且通过这种方法,除了少数情况,您不会得到任何数字的平方根。
-
阅读这里。希望这将消除您的所有疑虑。 geeksforgeeks.org/square-root-of-a-perfect-square
标签: binary-search