解法一:
class Solution {
/*//因为a^2 + b^2 >= 2ab
//而a^2 + b^2 = c
//所以c >= 2ab
//这样可以缩小查找范围
public boolean judgeSquareSum(int c) {
//因为负数的完全平方等于其绝对值的完全平方,所以只考虑正数就可以了,0也要考虑,因为可能那个数自己就是完全平方数
//下面囊括不了i为0的情况,所以0需要单独处理,即判断c本身是否为完全平方数
if(Math.sqrt(c) - Math.floor(Math.sqrt(c)) == 0){
return true;//不满足就走下面
}
for(int i = 1; i <= c / 2; i++){
//j从i开始,可以减少循环次数
for(int j = i; j <= c / (2 * i); j++){//c >= 2ab,那么b <= c / (2 * a)
if(i*i + j*j == c){
//System.out.println(i + " " + j);
return true;
}
}
}
return false;
}*/
public boolean judgeSquareSum(int c) {
if (c < 0) {
return false;
}
//上面两个循环干的活这里一个循环就能搞定,两个循环会超时
//因为满足条件的两个整数肯定来自于0到(int)Math.sqrt(c)
//所以走一趟循环就行了
int left = 0, right = (int)Math.sqrt(c);
while (left <= right) {
int cur = left * left + right * right;
if (cur < c) {//如果当前值比c小,说明左侧的还要增加
left++;
} else if (cur > c) {//如果当前值比c大,说明左侧的要减小
right--;
} else {
return true;
}
}
return false;
}
}