leetcode69求平方根

按照小will大佬的科学培养方案,今天正式入门算法,尝试一下二分查找的题目
这道题简单来说就是开根号
思路一:
我的第一反应遍历就好了,但是出现了这个错误,sad。。。(时间复杂度是O(n))


那么就要尽可能减少时间复杂度嘛,通过大佬的提示我想到了二分法
(1)采用一个左值 i 和一个右值 j ,如果一个的平方比 x 大,一个的平方比 x 小不就是在这两个值中间了嘛,不断逼近就好了。最后选择 i 的值。
(2)按照题目中对4开跟很容易实现,那么对8呢?就会出现 i 和 j 是小数的情况,那么就需要对其进行强行类型转换int()
(3)8的问题解决之后发现9还会出现问题,就是 i 和 j 不断逼近,只会使 i 不断接近3,但是永远无法达到3,那么就需要在循环中添加一个对 i+1 的判断,最后也就解决啦~
代码:

class Solution {
public:
    int mySqrt(int x) {
        double i=0,j=x;
        double point;
        if(x==1)
            return 1;
        else{
            while((j-i)>=0.00000001){
                point=(i+j)/2;
                if(point*point>x){
                    j=point;
                }
                else if(point*point

这样的时间复杂度只有O(logn)。
另外在别人的博客里面看到了一种很神奇的解法:
思路二:
就是利用牛顿法逐步逼近方程的解。

leetcode69求平方根_第1张图片

class Solution {
public:
    int mySqrt(int x) {
        double a,a0;
        a=x;
        while(abs(a-a0)>0.000001){
            a0=a;
            a=a0/2+x/(2*a0);
        }
        return int(a);
    }
};

ps:在这个问题里面其实对精度是比较明显的,同样的一个算法,如果你的精度控制的不够小,同样是不会被ac的。

你可能感兴趣的:(leetcode69求平方根)