Table of Contents
Problem Statement
Valid Perfect Square LeetCode Solution – Given a positive integer num, write a function that returns True if num is a perfect square else False.
Follow up: Do not use any built-in library function such as sqrt.
Input: num = 16 Output: true
Explanation
A boundary for our solution is fixed. for any number n, it’s square-root can lie between 1 and n so we know that the answer will be in 1 to n.
Simple Approach
Check for every number in 1 to n. would take O(n) time.
Optimized Approach
The idea is simple we just find all pair divisors. We iterate from 2 to …, and when we find a divisor,
we try to divide num by it one more time.
For example:
input: num = 180
iterate beginning from 2:
180%2==0 ?
yes -> num = 180/2 = 90
check if we can divide by 2 again:
90%2==0 ?
yes -> num = 90/2 = 45
num is 45 now.
since num was decreased, we should again iterate beginning from 2:
45%2==0 ?
no -> continue to iterate
45%3==0 ?
yes -> nums = 45/3 = 15
let’s divide one more time
15%3==0 ?
yes -> nums = 15/3 = 5
num is 5 now.
num was decreased -> again iterate beginning from 2
5%2==0 ?
no -> continue to iterate
5%3==0 ?
no -> continue to iterate
5%4==0 ?
no -> continue to iterate
5%5==0 ?
yes -> nums = 5/5 = 1
check if we can divide one more time:
1%5==0 ?
no -> return false
Apply binary search on the search space and the problem can be solved in O(log n) time.

Code
C++ Code For Valid Perfect Square
class Solution {
public:
bool isPerfectSquare(int num) {
if (num < 0) return false;
if (num == 0 || num == 1) return true;
int i = 0;
int j = num;
while (i <= j) {
long b = i + (j-i)/2;
if (b*b == num)
return true;
else if (b*b < num)
i = b+1;
else
j = b-1;
}
return false;
}
};Java Code For Valid Perfect Square
class Solution {
public boolean isPerfectSquare(int num) {
int low=1, high=num;
while(low<=high) {
long mid=(low+high)>>>1;
if(mid*mid==num) return true;
else if(mid*mid>num) high=(int)mid-1;
else low=(int)mid+1;
}
return false;
}
}Python Code For Valid Perfect Square
class Solution:
def isPerfectSquare(self, num: int) -> bool:
left = 0
right = num
while left <= right:
mid = (left+right)//2
if mid*mid==num:
return True
elif mid*mid > num:
right = mid - 1
else:
left = mid+1
return FalseComplexity Analysis for Valid Perfect Square LeetCode Solution
Time Complexity
Time Complexity of binary search is: O(log n)
Space Complexity
Space Complexity of binary search is: O(1)
Reference: https://en.wikipedia.org/wiki/Perfect_square