力扣小白刷题之633题平方数之和

题目描述

给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a ^2 + b ^2 = c。

思路

判断一个非负整数是否为两个整数的平方和,可以看成是在 元素为 0 ~ c的有序数组中查找两个数,使得这两个数的平方和为 c。

方法

双指针
本题的关键是右指针的初始化,实现剪枝,从而降低时间复杂度。
设右指针为 x,左指针固定为 0,为了使 0 ^2 + x ^2 的值尽可能接近 c,我们可以将 x 取为 sqrt©。

代码

力扣小白刷题之633题平方数之和
时间复杂度: O(sqrt©)
空间复杂度: O(1)

一些注意:

  1. 要考虑sum的溢出问题,使用i * i == c - j * j;
  2. int c; int j = (int)Math.sqrt(c);
  3. 还可以使用费马平方和定理
    一个非负整数 c 能够表示为两个整数的平方和,当且仅当 c 的所有形如 4k + 3 的质因子的幂次均为偶数。(但是我不会用qaq…)