Valid Perfect Square

easy math binary search

Problem

Given a positive integer num, return true if num is a perfect square (some integer r with r*r = num), otherwise false. Do not use any built-in sqrt.

Inputnum = 16
Outputtrue
Binary search r in [1, num]; compare r*r with num.

def isPerfectSquare(num):
    lo, hi = 1, num
    while lo <= hi:
        mid = (lo + hi) // 2
        sq = mid * mid
        if sq == num: return True
        if sq < num: lo = mid + 1
        else: hi = mid - 1
    return False
function isPerfectSquare(num) {
  let lo = 1, hi = num;
  while (lo <= hi) {
    const mid = Math.floor((lo + hi) / 2);
    const sq = mid * mid;
    if (sq === num) return true;
    if (sq < num) lo = mid + 1;
    else hi = mid - 1;
  }
  return false;
}
class Solution {
    public boolean isPerfectSquare(int num) {
        long lo = 1, hi = num;
        while (lo <= hi) {
            long mid = (lo + hi) >>> 1;
            long sq = mid * mid;
            if (sq == num) return true;
            if (sq < num) lo = mid + 1;
            else hi = mid - 1;
        }
        return false;
    }
}
class Solution {
public:
    bool isPerfectSquare(int num) {
        long lo = 1, hi = num;
        while (lo <= hi) {
            long mid = (lo + hi) / 2;
            long sq = mid * mid;
            if (sq == num) return true;
            if (sq < num) lo = mid + 1;
            else hi = mid - 1;
        }
        return false;
    }
};
Time: O(log num) Space: O(1)