leetcode633,给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
采用双指针法。
这是我最初的代码,测试用例在2147482647时报错了。 显然,i*i+j*j超出32位整数所能表示的最大值了。
bool judgeSquareSum(int c) {
int i = 0,j = sqrt(c);
while(i <= j) {
int s = i*i + j*j;
if(s == c) {
return true;
} else if(s < c) {
i++;
} else {
j--;
}
}
return false;
}
因此把加改为减,顺利通过。
bool judgeSquareSum(int c) {
int i = 0,j = sqrt(c);
while(i <= j ) {
int k = c - j*j;
if(k == i*i) {
return true;
} else if(k > i*i) {
i++;
} else {
j--;
}
}
return false;
}
在比较的时候可以用减法的时候不用加法,加法可能导致溢出。当然,也要具体问题具体分析,避免出现负溢出。