给定一个非负整数 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
题解:
这种看上去简单的的题目,我就想先用暴力写一次,虽然知道肯定超时,但是万一呢。代码如下,甚至还是优化过一点点的,比如i*i <=c,但随着c数值增大还是超时了。
bool judgeSquareSum(int c) {
for(long i = 0 ;i*i <= c ; i ++)
for(long j = 0 ; j*j <= c; j ++)
if (c == i * i + j * j)
return true;
return false;
}
得动动脑子,想点别的办法。
仔细思考,其实只需要一个循环,遍历一个数字从0到根号下c。另一个数字自然可以通过c与第一个数字的关系计算出来,如代码所示,少了一个循环,时间复杂度大大降低。还算是比较简单的题目,不过容易陷入暴力的误区。
bool judgeSquareSum(int c) {
for(long i = 0 ;i*i <= c ; i ++){
double j = sqrt(c - i * i);
if (j == (int)j)
return true;
}
return false;
}
3956

被折叠的 条评论
为什么被折叠?



