给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
示例 1:
输入:c = 5 输出:true 解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3 输出:false
示例 3:
输入:c = 4 输出:true
示例 4:
输入:c = 2 输出:true
示例 5:
输入:c = 1 输出:true
提示:
0 <= c <= 231 - 1
sqrt 法
class Solution {
public boolean judgeSquareSum(int c) {
for(long i=0;i<=Math.sqrt(c);i++){
double j=Math.sqrt(c-i*i);
if(j==(int)j){
return true;
}
}
return false;
}
}
双指针法
我们假设left=0 right最大等于根号c所以right=sqrt(c)
双指针法有三种情况 当sum=c时 返回true
当sum>c时我们应该让right--因为当和小数和大数平方和大于某一值时应将大数减小
当sum<c时left++
结束条件应该是当left==right 因为当左指针等于右指针时以为着已经遍历了所有可能的值
class Solution {
public boolean judgeSquareSum(int c) {
long left = 0;
long right = (long) Math.sqrt(c);
while (left <= right) {
long sum = left * left + right * right;
if (sum == c) {
return true;
} else if (sum > c) {
right--;
} else {
left++;
}
}
return false;
}
}