题解一:二分
题解思路: 二分查找比a<=mysqrt(x)<=b
如果 mid*mid <=x 且(mid+1)(mid+1) <x 返回mid
如果mid*mid > x right = mid-1;
否则 left = mid+1;
图示:
图片说明
复杂度分析:
时间复杂度:O(logn),二分查找的复杂度,每次循环减少一半
空间复杂度;O(1),只使用了有限常数个变量;
实现如下:

class Solution {
public:
    /**
     *
     * @param x int整型
     * @return int整型
     */
    int mysqrt(int x) {
        // write code here
        if(x==1) return 1;
        int left = 1,right = x; //左右边界
        while(right>=left){
            int mid = (right+left)/2;  //中间值
            if(mid<=x/mid&&(mid+1)>x/(mid+1)) return mid; // mid*mid可能溢出,所以用除法
            if(mid>x/mid) right = mid -1;
            else  left = mid +1;
        }
        return 0;
    }
};

题解二:利用平方数的性质
题解思路: 利用平方数的性质
图片说明
复杂度分析:
时间复杂度:O(N),每次+2的循环,为(1/2)N的时间复杂度,去掉系数,为O(N)
空间复杂度: O(1),只使用了有限常数个变量;
实现如下:

class Solution {
public:
    /**
     *
     * @param x int整型
     * @return int整型
     */
   int mysqrt(int x) {
        if(x<=0) return 0;  //小于等于0 返回0
        int ans = 1; 
        int num = 1;
        int  i = 3;
        while(num+i<=x){
            num+=i;  
            ans ++; // 每加一个奇数,ans+1
            i += 2;
        }
        return ans;
    }
};