Coder's Cat

LeetCode: Sqrt(x)

2020-02-03

Challenge Description

Implement int sqrt(int x).

Compute and return the square root of x, where x is guaranteed to be a non-negative integer.

Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.

Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.

With binary search, the left pivot will be the integer value of sqrt. Remember don’t write the code like, this will trigger overflow for some inputs:

if(mid * mid == x) 
.....

Time complexity: $O(log(x))$.

class Solution {
public:
int mySqrt(int x) {
int left = 0;
int right = x;
if(x <= 1) return x;
while(left < right-1) {
int mid = left + (right - left) / 2;
if(mid == x/mid)
return mid;
else if(x/mid < mid)
right = mid;
else
left = mid;
}
return left;
}
};

Approach with newton methods

Newtons’ method is a clever method for computing the sqrt value, and we use double type for the accuracy.

#include <math.h>
class Solution {
public:
int mySqrt(int x) {
double val = (double)x;

if(x <= 1) return x; //corner case
while(true) {
double last = val;
val = (val + (double)x/val) * 0.5;
if(abs(val - last) < 1e-9)
break;
}
return (int)val;
}
};

Preparing for an interview? Check out this!