力扣 633. 平方数之和

题目说明

  • 给定一个非负整数 c ,你要判断是否存在两个整数 ab,使得 a2 + b2 = c
  • 提示:
    • 0 <= c <= 231 - 1

示例

例1

1
2
3
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5

例2

1
2
输入:c = 3
输出:false

例3

1
2
输入:c = 4
输出:true

笔者理解

此题是一道数学算法问题,在力扣题库中被定义为中等题。

解法

当笔者阅读完此题后,发现此题运用双指针的解法就很巧妙,直接根据边界条件向中间试探就好了,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public boolean judgeSquareSum(int c) {
// 采用双指针的思路
// c = a^2 + b^2中 a,b差距最大的情况 就是c刚好能够开平方,a,b中有一个等于0
int i = 0;
int j = (int) Math.sqrt(c);

int num;
while (i <= j) {
num = i * i + j * j;

// 求出来的值小于c时,就将i调大
if (num < c) {
i++;
}
// 求出来的值大于c时,就将j调小
else if (num > c) {
j--;
}
else {
return true;
}
}

return false;
}

时间和空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是今天的每日一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。