633. 平方数之和

题目

给定一个非负整数 c ,你要判断是否存在两个整数 ab,使得 a2 + b2 = c

示例 1:

输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5

示例 2:

输入:c = 3
输出:false

提示:

  • 0 <= c <= 231 - 1

思路

分析此题,需要两个整数的和等于C,那么一个数的平方的情况呢,就是C开方。比如5,开方后是2.23,向下取整得2,也就是最大的整数平方就是2的平方了,更大的整数比如3,平方后肯定大于C,所以不用考虑。

由于这里是平方相加,负数的情况下也会被转换为正数,所以不用考虑负数参与。平方后和正数是一样的。

那也就是说最大的解的范围就在[1, 2]之间,所以我们用双指针遍历。之后的解题思路和两数之和的逻辑类似。

我自己在做题时有遇到一个问题,就是这里是用C开方来确定最大值的,那么是不是循环中就不会有比C大的情况了?

这其实是个误区。首先我们确定解的范围的最大值是在一个数平方的情况下讨论的,以25为例,他开方后是5。如果解的最大值是6,6的平方是36,直接就比C大了所以不可能。

而0的平方+5的平方就算是25的解,这里也提醒我们解的范围也要包含0。

另外允许l==r,因为2= 1^2 + 1^2

class Solution {
    public boolean judgeSquareSum(int c) {
        int max = (int) Math.sqrt(c);
        int l = 0, r = max, s = 0;
        int[] range = new int[max + 1];
        for (int i = 0; i < range.length; i++) {
            range[i] = s++;
        }
        while (l <= r) {
            double res = Math.pow(range[l], 2) + Math.pow(range[r], 2);
            if (res == c) {
                return true;
            } else if (res < c) {
                l++;
            } else {
                r--;
            }
        }
        return false;
    }
}
posted @ 2025-07-02 20:11  恒星同学  阅读(11)  评论(0)    收藏  举报