Grokking the Coding Interview: Patterns for Coding Questions
Vote

0% completed

​

Solution: Sqrt

Problem Statement

Solution

Step-by-Step Algorithm

Algorithm Walkthrough

Code

Complexity Analysis

Time Complexity

Space Complexity

Problem Statement

Given a non-negative integer x, return the square root of x rounded down to the nearest integer. The returned integer should be non-negative as well.

You must not use any built-in exponent function or operator. For example, do not use pow(x, 0.5) in C++ or x ** 0.5 in Python.

Example 1:

Input: x = 8
Output: 2
Explanation: The square root of 8 is 2.8284, and since we need to return the floor of the square root (integer), hence we returned 2.  

Example 2:

Input: x = 4
Output: 2
Explanation: The square root of 4 is 2.

Example 3:

Input: x = 2
Output: 1
Explanation: The square root of 2 is 1.414, and since we need to return the floor of the square root (integer), hence we returned 1.  

Constraints:

  • 0 <= x <= 2<sup>31</sup> - 1
Image

Solution

We can use a Binary Search approach to calculate the square root of an integer x without using any in-built sqrt function.

For any integer x, the square root of x will lie between 0 and x/2 (inclusive) for x > 2. Therefore, we can efficiently use binary search within this range to find the integer part of the square root (i.e., the floor value). By narrowing down the potential values step-by-step, binary search allows us to determine the largest integer y such that y*y is less than or equal to x.

This approach ensures an efficient and accurate computation of the square root, especially for large values of x, due to the logarithmic nature of binary search.

Step-by-Step Algorithm

  1. Handle Base Cases: If x is less than 2, return x directly (since the square root of 0 is 0, and the square root of 1 is 1).
  2. Initialize Pointers: Set left to 2 and right to x / 2.
  3. Binary Search Loop:
    • While left is less than or equal to right:
      • Calculate mid as left + (right - left) // 2.
      • Calculate num as mid * mid.
      • If num is greater than x, move right to mid - 1.
      • If num is less than x, move left to mid + 1.
      • If num equals x, return mid.
  4. Return Result: Return right as the integer part of the square root of x.

Algorithm Walkthrough

Let's consider the input n = 8:

  1. Initialize:

    • Input x = 8.
    • Since x is not less than 2, proceed to the next step.
    • Set left = 2 and right = 4 (8 // 2).
  2. First Iteration:

    • Calculate mid = 2 + (4 - 2) // 2 = 3.
    • Calculate num = 3 * 3 = 9.
    • Since num (9) is greater than x (8), move right to mid - 1 = 2.
  3. Second Iteration:

    • Now left = 2 and right = 2.
    • Calculate mid = 2 + (2 - 2) // 2 = 2.
    • Calculate num = 2 * 2 = 4.
    • Since num (4) is less than x (8), move left to mid + 1 = 3.
  4. End Loop:

    • Now left = 3 and right = 2.
    • Since left (3) is greater than right (2), exit the loop.
  5. Return Result:

    • Return right = 2 as the integer part of the square root of x = 8.

Code

Here is the code for this algorithm:

Python3
Python3

. . . .

Complexity Analysis

Time Complexity

  1. Binary Search Algorithm: The key part of this algorithm is the binary search, which repeatedly divides the search interval in half. The time complexity of binary search is O(log n), where n is the size of the search space. In this case, the search space is initially from 2 to x/2.

  2. Search Space: The maximum size of the search space is x/2 (when x \geq 4). For smaller values of x, the function immediately returns x, as it's either 0 or 1.

  3. Overall Time Complexity: Considering the binary search on a range up to x/2, the time complexity is O(log(x/2)), which simplifies to O(\log x).

Space Complexity

  1. Constant Extra Space: The algorithm uses a fixed number of integer variables (left, right, pivot, num), regardless of the input size.

  2. No Recursive Calls or Dynamic Allocation: The implementation does not use recursion or allocate additional data structures that grow with the input size.

  3. Overall Space Complexity: Given the constant amount of extra space, the space complexity is O(1), meaning it's constant.

A

Anonymous

· 3 years ago

I just wanted to suggest a more subtle way of explaining it that may be a bit better. So, binary search is applied here because we are searching for a value in a specific range of values, which is a range of sorted numbers. That value we are looking for is the largest value n such that n * n <= x. So, we can use a variable to store the result, and if we ever find a value whose square is <= x, update the result to that. However, since our goal is to find the largest, toss that pivot out and set left = mid + 1. If the square is too large, then we want to lower our right bound and set right = mid - 1.

class Solution { public int mySqrt(int x) { int left = 0; int right = x; int res = 0; while(left <= right){ int mid = left + (right - left) / 2; if((long
Show 1 reply
A

Anonymous

· 3 years ago

I came up with the following solution.

class Solution { public: int mySqrt(int x) { int i = 0; while(i * i <= x){i++;} // TODO: Write your code here return i - 1; } };

Basically, just increment i until you pass the square root, then return previous value.

Am I missing something? Why is the more complex solution the example?

Show 6 replies

Reading Progress

0%


Vote for new content

On This Page

Problem Statement

Solution

Step-by-Step Algorithm

Algorithm Walkthrough

Code

Complexity Analysis

Time Complexity

Space Complexity