题目原意:
Implement int sqrt(int x)
.
Compute and return the square root of x.
实现int sqrt(int x).计算并返回x的平方根。
Solution 1:初始想法,brute force
解题思路:
需要注意的是此题不用考虑非正数,加上题目标注返回值为int,因此只需要返回x的Math.floor(平方根)即可。
mySqrt(1) = 1;
mySqrt(2) = 1;
mySqrt(3) = 1;
...
mySqrt(10) = 3;
经过演算,从2开始,平方根始终 <= Math.floor(x/2).
因此我们用变量i从1至Math.floor(x/2) loop,找到第一个i*i>x, 返回i-1;
效率计算:
时间复杂度:O(n)
空间复杂度:O(1)
代码如下:
/** * @param {number} x * @return {number} */ var mySqrt = function (x) { var start = 0, end = Math.floor(x / 2); // 注意等号的情况,2为special case while (start <= end) { var product = (start + 1) * (start + 1); if (product < x) { start++; } else if (product === x) { return start + 1; } else { return start; } } // Input 0 or 1 return x; };
Solution 2: Binary Search
解题思路:
Instead of using loop from 1 to Math.floor(x/2),
We can use binary search to check the product of mid * mid.
效率计算:
时间复杂度:O(logn)
空间复杂度: O(1)
代码如下:
/** * @param {number} x * @return {number} */ var mySqrt = function(x) { var start = 1, end = Math.floor(x/2); while(start <= end) { var mid = Math.floor((start+end)/2); if(mid * mid < x) { if((mid+1) * (mid+1) > x) { return mid; } else if((mid+1) * (mid+1) === x) { return mid+1; } else { start = mid+1; } } else { end = mid-1; } } return x; };