题目描述
判断一个非负整数是否为两个正整数的平方和。
示例 1:
输入:5
输出:True
描述:1 * 1 + 2 * 2 = 5
示例 2:
输入:6
输出:False
描述:找不到满足平方和为6的两个正整数
示例 3:
输入:25
输出:True
描述:3 * 3 + 4 * 4 = 25
算法:twoSquareSum()
看作是在元素为 0~target 的有序数组中查找两个数,使得这两个数的平方和为target,如果能找到则返回True,表示target是两个整数的平方和。本题使用双指针求出两个数,使他们的平方和为target。
核心: 左指针为0,右指针为下x。为了满足02 + x2 无限接近 target ,可以将 x = sqrt(target)。
因为最多只需要遍历一次0~sqrt(target),所以时间复杂度为O(sqrt(target));而只使用了两个额外的变量,所以空间复杂度为O(1)。
public boolean twoSquareSum(int target) {
if (target < 0) return false;//如果输入的整数为负数,则不存在平方和
int i = 0, j = (int) Math.sqrt(target);//分别定义了左指针和右指针
while (i <= j) {//循环条件至少要满足左指针不会移到右指针右侧
int powSum = i * i + j * j;//求平方和
if(powSum == target) {//if else判断两数平方和powSum与target是否相等
return true;
} else if (powSum > target) {
j--;
} else {
i++;
}
}
return false;
}
}
注释:写的不好之处请您纠正,新手小白,期待您来指教!!!