平方数之和

https://leetcode-cn.com/problems/sum-of-square-numbers/

c^2 = a^2 + b^2 (不妨设a < b)

运用了Math的sqrt函数求出与目标值最接近的b

然后把a 从0到b 开始设置双指针来遍历

有一个要注意的点就是这里的a可以等于b,和昨天那个题不同,那个是数组中的不同元素比较,所以才不相等,这个能否相等的问题也需要多注意下。

找的这个问题的原因其实是因为提交错了...

看到实际用例是2 然后返回的是false,因为当时想法其实是觉得平方了再取整数部分的话,再次平方的话,剩下的部分应该没有之前的部分大了,没有把两个相等的平方和考虑进去,需要之后注意一下细节方面


class solution{

    public boolean judgeSquareNumber(int c){

        //因为要用到平方和,所以我们应该要把不符合的情况排除

        if( c < 0) return false;

        int i = 0;

        int j = (int) Math.sqrt(c);

        while( i <= j){

            int temp = i*i + j*j;   

            if(temp == c) return true;

            else if(temp < c) i++;

            else j--;

        }

    return false;

}

看官方的题解还有下面几种方法

使用了费马定理:一个非负整数 C 能够表示为两个整数的平方和,当且仅当C 的所有形如 4k+3 的质因子的幂次均为偶数。

image

使用了sqrt公式,这个和双指针的方法不一样,是遍历每个可以存在的a,找出是不是有这样的一个b满足a^2 +b^2 = C


class solution{

    public boolean judgeSquareNumber{

           for(long a = 0; a * a <= c; a++){

                double b = Math.sqrt(c - a*a);

                if(b == (int) b) return true;

            }

            return false;

    }

}

你可能感兴趣的:(平方数之和)