Sqrt(x)

Implementint sqrt(int x).


比如说给 100, return 一个10给他。 

暴力做法肯定是从1 开始遍历到x那么大, 每走一步试一下 current ^ 2 == x?  等于的时候就表示现在这个current就是sqrt(x).  【这里不对。。如果x = 2000,  sqrt(x) 要是44...】

但是如果input非常大, 这么做太慢了。

于是发现Binary Search 来做非常好!

Sqrt(x)_第1张图片

T^T 我跟他犯了一样的错误, 都是拿mid*mid 来比。  比如 求 sqrt(2)   其实是没有结果的,这时候应该取1,最后一个跟它接近的值。 如果用mid*mid 很多情况都不会出现equal. 比如2!=1.

但是如果每次都是 target = target/mid;  if(target == mid) 这样就ok

Sqrt(x)_第2张图片


我的另一个错误: 一开始竟然拿temp = temp/mid! 这样这个x的值没两下就不见了。

Sqrt(x)_第3张图片


Sqrt(x)_第4张图片

这题巨Tricky。。。最后return ending point.


2018年update...

这题一个比较好的思路来理解是:

用二分法取到Middle Point以后,用target / middle = temp

如果Middle > temp 证明 一个factor太大 一个Factor太小。

我们要找的是mid * mid = target 所以 mid 和 temp 必须差不多大才可以。 我们控制low, high boundary能够取得的效果就是调整mid。我们不可能去放大mid 如果mid > temp, 不然temp只会更小,所以我们要让mid变小。

所以我们要往Middle的左边找

为什么while 内如果无法return  最后要return High?

例如 input = 8

1 2 3 4 5 6 7

第一次选 4, 4*4=16 > 8. 第二次把范围限制在1--3. 选择middle = 2, 但是8 / 2 = 4. 然后把Low变成3 = high.  这时候选择Middle = 3,   8 / 3 = 2.几   约等于2   Mid > temp 所以High设置为 mid - 1= 2.    所以出了循环 并且此时Low > high, 但是High就是result... 【非常复杂的逻辑。。。】


Sqrt(x)_第5张图片

你可能感兴趣的:(Sqrt(x))