题目:给一个正整数,判断它是不是完全平方数。


解法:

  1. 二分法。给的是int型的正整数,所以下界是1,上界是最大正整数Integer.MAX_VALUE的平方根。但要注意一定要用乘法来判断相等时的情况。下面是代码:

  public static int mySqrt(int x) {
        if(x == 0) return 0;
        int left = 1, right = Integer.MAX_VALUE;
        while(true){
            int mid = left + (right-left)/2;
            if(mid > x/mid)
                right=mid-1;
            else{
                if(mid+1>x/(mid+1))
                    return (int)mid;
                left=mid+1;
            }
        }
    }
    
    public static boolean isPerfectSquare(int num) {
        if(num == 0) return true;
        int left = 1, right = mySqrt(Integer.MAX_VALUE);
        while(right >= left){
            int mid = left + (right-left)/2;
            if(mid*mid == num)
                return true;
            else if(mid*mid > num)
                right = mid - 1;
            else
                left = mid + 1;
        }
        return false;
    }

2.数学技巧:所有的完全平方数都可以被表示成奇数和1+3+5+7+9 ...。

public boolean isPerfectSquare(int num) {
     int i = 1;
     while (num > 0) {
         num -= i;
         i += 2;
     }
     return num == 0;
 }

KirkBai
27 声望6 粉丝