力扣小白刷题之633题平方数之和
题目描述
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a ^2 + b ^2 = c。
思路
判断一个非负整数是否为两个整数的平方和,可以看成是在 元素为 0 ~ c的有序数组中查找两个数,使得这两个数的平方和为 c。
方法
双指针
本题的关键是右指针的初始化,实现剪枝,从而降低时间复杂度。
设右指针为 x,左指针固定为 0,为了使 0 ^2 + x ^2 的值尽可能接近 c,我们可以将 x 取为 sqrt©。
代码
时间复杂度: O(sqrt©)
空间复杂度: O(1)
一些注意:
- 要考虑sum的溢出问题,使用
i * i == c - j * j;
int c; int j = (int)Math.sqrt(c);
- 还可以使用费马平方和定理:
一个非负整数 c 能够表示为两个整数的平方和,当且仅当 c 的所有形如 4k + 3 的质因子的幂次均为偶数。(但是我不会用qaq…)