1.题目
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c 。
示例 1:
输入:c = 5
输出:true
解释:1 ^1 + 2^2 = 5
示例 2:
输入:c = 3
输出:false
提示:
0 <= c <= 2^31 - 1
2.思路
2.1 双指针
不失一般性,可以假设a<b。初始时a=O,b=√c,进行如下操作:
如果a^ 2+b ^ 2=c,我们找到了题目要求的一个解,返回true;
如果a^ 2+b ^ 2<c,此时需要将a的值加1,继续查找;
如果a^ 2+b ^ 2>c,此时需要将b的值减1,继续查找。
当a=b时,结束查找,此时如果仍然没有找到整数a和b满足a^ 2+b ^ 2=c,则说明不存在题目要求的解,
返回false.
注意 0 <= c <= 2 ^ 31 - 1 因为相乘需要将精度设置为 long类型 64 位的
3.代码
object Solution {
def judgeSquareSum(c: Int): Boolean = {
var left : Long = 0
var right : Long = Math.sqrt(c).toLong
while (left<=right){
if(left*left+right*right>c) right = right - 1
else if(left*left+right*right < c) left = left - 1
else return true
}
false
}
}
4.复杂度分析
- 时间复杂度:O(根号c)。最坏情况下 a 和 b 一共枚举了 0 到根号下c
里的所有整数。 - 空间复杂度:O(1)。