【LeetCode】633.平方数之和
![](https://storage.bummon.com/image/202308171051399.png)
【LeetCode】633.平方数之和
Bummon【力扣】633.平方数之和
题目
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 $a^2$ + $b^2$ = c 。
示例 1:
1 | 输入: c = 5 |
示例 2:
1 | 输入: c = 3 |
提示:
0≤ c ≤ 231-1
双指针法
思路分析
由题意得,我们可以定义两个变量 a
和 b
,使 a * a + b * b = c
,且又可以看到题目中提示了 0≤c ≤231-1
,那么我们假设a=0,那么b= $\sqrt{c}$,此时 a为最小值,b为最大值,那么我们可以得出:
- 当 a^2 + b^2 == c 时,我们得到了想要的结果
- 当 a^2 + b^2 > c 时,我们需要让 a 大一些,也就是 a+1
- 当 a^2 + b^2 < c 时,我们需要让b小一些,也就是 b-1
通过下图来理解。
图解
代码实现
1 | public boolean judgeSquareSum(int c) { |
sqrt函数法
思路分析
我们还可以使用Java中的 Math.sqrt()
函数来实现,sqrt
函数是一个取根号,我们可以用传入的 c 来减去 a^2,结果设为 b^2 ,最后通过 sqrt
函数来取出 b ,最终我们通过强转 int
来使其变成整数,并判断 强转前的 b
和 强转后的 b
进行对比,如果相等说明取出的 b 为整数,如果不相等那就说明 不是整数,那就继续循环。
代码实现
1 | public boolean judgeSquareSum(int c) { |
总结
在该题目中我们使用了两种写法:双指针法
和 sqrt函数法
。
在 双指针法
中,数组最多遍历到 $\sqrt{c}$ ,则时间复杂度为 $O(\sqrt{c})$,空间复杂度为 O(1)。
在 sqrt函数法
中,我们最大判定条件为 a * a ≤ c
,那么时间复杂度为 O($\sqrt{c}$),空间复杂度为O(1)。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果