我很难理解如何增加低或高。
例如,这是来自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
?
总的来说,我很难看出我是否应该从中点增加低点。如果我在low <= high
循环中包含low < high
或while
,我也会遇到问题。
答案 0 :(得分:2)
你的算法不是二元搜索。 此外,它不起作用。
举例x = 5
Initial:
low = 1, high = 5
Iter 1:
mid = 3
5/3 = 1 so high = 4
Iter 2:
mid = 2.5 => 2 (because int)
5/2 = 2 (because int)
<returns 2>
对于完美的方形输入,您的算法只能通过mid
而不是high
或low
来提供正确的结果。
顺便说一句,如果mid
你需要增加x/mid > mid
,否则你需要减少它。您增加和减少mid
的方法分别递增low
或递减high
。
这没关系,但这并不能产生二进制搜索。您的high
将遍历从x
到(2*sqrt - 1)
的所有整数。
请关注@sinsuren评论以获得更好的解决方案
答案 1 :(得分:0)
这是平方根的Babylonian方法:
/*Returns the square root of n.*/
float squareRoot(float n)
{
/*We are using n itself as initial approximation
This can definitely be improved */
float x = n;
float y = 1;
float e = 0.000001; /* e decides the accuracy level*/
while(x - y > e)
{
x = (x + y)/2;
y = n/x;
}
return x;
}
为了更加了解,您可以随时关注this link