码迷,mamicode.com
首页 > 其他好文 > 详细

【 Sqrt(x) 】cpp

时间:2015-05-29 17:15:45      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

题目:

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返回即可。

【 Sqrt(x) 】cpp

标签:

原文地址:http://www.cnblogs.com/xbf9xbf/p/4538571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!