Welcome to Subscribe On Youtube

Question

Formatted question description: https://leetcode.ca/all/367.html

Given a positive integer num, return true if num is a perfect square or false otherwise.

A perfect square is an integer that is the square of an integer. In other words, it is the product of some integer with itself.

You must not use any built-in library function, such as sqrt.

 

Example 1:

Input: num = 16
Output: true
Explanation: We return true because 4 * 4 = 16 and 4 is an integer.

Example 2:

Input: num = 14
Output: false
Explanation: We return false because 3.742 * 3.742 = 14 and 3.742 is not an integer.

 

Constraints:

  • 1 <= num <= 231 - 1

Algorithm

Search from 1 to sqrt(num) to see if there is a number whose square is exactly equal to num.

Code

  • 
    public class Valid_Perfect_Square {
    
    
        public boolean isPerfectSquare(int num) {
            if (num == 0 || num == 1) {
                return true;
            }
    
            int l = 1, h = num;
    
            // binary search for mid*mid
            while (l <= h) {
                int mid = l + (h - l) / 2;
                if (mid == num / mid && num % mid == 0) {
                    return true;
                }
                else if (mid < num / mid) {
                    l = mid + 1;
                }
                else {
                    h = mid - 1;
                }
            }
    
    //        int[] array = IntStream.rangeClosed(Integer.MIN_VALUE, Integer.MAX_VALUE).toArray();
    //        Arrays.binarySearch(array, num);
    
            return false;
        }
    
    }
    
    ############
    
    class Solution {
        public boolean isPerfectSquare(int num) {
            long left = 1, right = num;
            while (left < right) {
                long mid = (left + right) >>> 1;
                if (mid * mid >= num) {
                    right = mid;
                } else {
                    left = mid + 1;
                }
            }
            return left * left == num;
        }
    }
    
  • // OJ: https://leetcode.com/problems/valid-perfect-square/
    // Time: O(sqrt(num))
    // Space: O(1)
    class Solution {
    public:
        bool isPerfectSquare(int num) {
            long i = 0;
            while (i * i < num) ++i;
            return i * i == num;
        }
    };
    
  • class Solution:
        def isPerfectSquare(self, num: int) -> bool:
            left, right = 1, num
            while left < right:
                mid = (left + right) >> 1
                if mid * mid >= num:
                    right = mid
                else:
                    left = mid + 1
            return left * left == num
    
    ############
    
    class Solution(object):
      def isPerfectSquare(self, num):
        """
        :type num: int
        :rtype: bool
        """
        r = num
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        r = (r + num / r) / 2
        return r * r == num
    
    
  • func isPerfectSquare(num int) bool {
    	left, right := 1, num
    	for left < right {
    		mid := (left + right) >> 1
    		if mid*mid >= num {
    			right = mid
    		} else {
    			left = mid + 1
    		}
    	}
    	return left*left == num
    }
    
  • function isPerfectSquare(num: number): boolean {
        let left = 1;
        let right = num >> 1;
        while (left < right) {
            const mid = (left + right) >>> 1;
            if (mid * mid < num) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left * left === num;
    }
    
    
  • use std::cmp::Ordering;
    impl Solution {
        pub fn is_perfect_square(num: i32) -> bool {
            let num: i64 = num as i64;
            let mut left = 1;
            let mut right = num >> 1;
            while left < right {
                let mid = left + (right - left) / 2;
                match (mid * mid).cmp(&num) {
                    Ordering::Less => left = mid + 1,
                    Ordering::Greater => right = mid - 1,
                    Ordering::Equal => return true,
                }
            }
            left * left == num
        }
    }
    
    

All Problems

All Solutions