题目:
Implement int sqrt(int x)
.
Compute and return the square root of x.
代码:
class Solution { public: int mySqrt(int x) { if (x<2) return x; int l = 1; int r = x/2; while (l<=r) { int mid = (l+r)/2; if ( x / mid < mid ) { r = mid - 1; } else if ( x / mid > mid ) { l = mid + 1; } else { return mid; } } return l-1; } };
tips:
这个题一开始拿到感觉怪怪的,直接看的solution。
直观上认为,只要是bianry search的问题,都应该是最终逼近到一个点上,不能来回震荡;但此题是的二分查找过程确确实实是震荡的。
比如输入400,记录mid的结果如下:
100
50
25
12
18
21
19
20
这种虽然产生了震荡,但是震荡必然越来越小,而且每次变化的长度至少是上一次的一半,时间复杂度也确实是O(logn).
有个细节,如果没有整数的平方数,最后会推出循环;而退出循环时,一定是从l - r = 1,因此取l-1返回即可。
原文:http://www.cnblogs.com/xbf9xbf/p/4538571.html