leetcode 367. 有效的完全平方数

 leetcode 367. 有效的完全平方数

采用二分查找,但要特别注意几点:

1)mid=a+(b-a)/2防止溢出;

2)判断是否是平方不能直接判断mid^2与num,有可能会溢出,因此先求mid_2=num/mid,当能够整除,且mid_2==mid时,即找到平方根,如果最终都没有找到,那么返回false;

class Solution {
public:
    bool isPerfectSquare(int num) {
        int a=1,b=num;
        while(a<=b){
            int mid=a+(b-a)/2;
            int mid_2=num/mid;
            int sub=num-mid_2*mid;
            if(sub==0 && mid_2==mid)
                return true;
            if(mid_2<mid)
                b=mid-1;
            else
                a=mid+1;
        }
        return false;
    }
};

 利用数学方法:1+3+5+7+……+(2n-1)=n2,只需要不断的从num中去掉奇数最后看是否为0就可以了,比二分法更快;

class Solution {
public:
    bool isPerfectSquare(int num) {
        int sum=1;
        while(num>0){
            num-=sum;
            sum+=2;
        }
        return (num==0)? true:false;
    }
};