题目描述如下:
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 +
。=c
示例 1:
输入:c = 5 输出:true 解释:1 * 1 + 2 * 2 = 5
算法思路:
根据题目要求,要找到两个数的平方和等于c。初步的想法就是枚举所有小于c的两个数进行判断,最后找到那两个数。
再仔细的想一下,其实不必枚举所有小于c的数,我们只需枚举到c的平方根的数即可,即,a<,b<
,因为这两个数的平方肯定都小于c。这样一来,搜索范围大大缩短。
接下来,我们考虑一下如何搜索。如果用两层循环分别对a,b都搜索个数,看起来也是没必要的。我们可以用两个指针分别从0和
两个位置开始往中间搜索,我们初始设a=0,b=
。那么会有如下的三种情况:
1. 如果此时使得 +
=c,那么我们就找到了这两个数。
2. 如果
+
<c,由于b已经到了可取的最大值
,所以我们不能移动b的指针。我们把a加1,然后再比较。
3. 如果
+
,然后再比较。>c,我们把b减1
最终即可找到这两个数。
注意,上面提到的是一个整数,我们可以通过各种编程语言的函数sqrt来取得平方根,然后再向下取整。比如JavaScript语言有如下的函数:
Math.floor(Math.sqrt(c));