题目描述:
Given a non-negative integer c
, your task is to decide whether there're two integers a
and b
such that a2 + b2 = c.
Example 1:
Input: 5
Output: True
Explanation: 1 * 1 + 2 * 2 = 5
Example 2:
Input: 3
Output: False
要完成的函数:
bool judgeSquareSum(int c)
说明:
1、这道题给定一个非负整数c,要求判断c能不能拆成两个整数的平方和。
2、这道题我们可以用判断法也可以用生成法,但这道题用生成法来做,时间复杂度比较高,还不如用判断法来做。
我们先找到有可能的整数的上限,比如要判断的数c是27,那么整数上限就是5。
再定义一个下限,从0开始。
我们判断上限和下限的平方和,大于还是小于,或者是等于c。
如果大于c的话,那么上限要减一。
如果小于c的话,那么下限要加一。
如果等于,那么返回true。
最终如果下限超过上限,那么返回false。
用这种寻找-判断的方法来做,是比较快的方法。
如果同学有更快的方法,欢迎分享在评论区~~
代码如下:
bool judgeSquareSum(int c)
{
int uplim=floor(sqrt(c)),lowlim=0,t;//uplim是上限,lowlim是下限,从0开始
while(lowlim<=uplim)//退出循环条件是下限超过上限
{
t=lowlim*lowlim+uplim*uplim;
if(t<c)
lowlim++;
else if(t>c)
uplim--;
else
return true;
}
return false;
}
上述代码实测6ms,beats 87.28% of cpp submissions。