Reference: LeetCode EPI 11.4
Difficulty: Easy
Problem
Given a positive integer num
, write a function which returns True
if num
is a perfect square else False
.
Note: Do not
use any built-in library function such as sqrt
.
Example:
Follow up:
Analysis
Brute-Force & Cheating
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public boolean isPerfectSquare(int num) { for (int i = 1; i <= num; ++i) { if (i * i == num) { return true; } } return false; }
public boolean isPerfectSquare(int num) { int x = (int) Math.sqrt(num); return x * x == num; }
|
Time: $O(N)$ for brute-force.
Space: $O(1)$
Binary Search
Standard Version:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public boolean isPerfectSquare(int num) { int lo = 1, hi = num; while (lo <= hi) { int mid = lo + (hi - lo) / 2; if (mid * mid == num) { return true; } if (mid > num / mid) { hi = mid - 1; } else { lo = mid + 1; } } return false; }
|
Other Version:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public boolean isPerfectSquare(int num) { int lo = 1, hi = num; while (lo <= hi) { int mid = lo + (hi - lo) / 2; if (mid >= num / mid) { hi = mid - 1; } else { lo = mid + 1; } } return (lo * lo == num); }
|
Time: $O(\log{N})$
Space: $O(1)$