Leetcode[633.平方数之和]-二维矩阵搜索
题目:
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3
输出:false
示例 3:
输入:c = 4
输出:true
示例 4:
输入:c = 2
输出:true
示例 5:
输入:c = 1
输出:true
提示:
0 <= c <= 2**31 - 1
方法1:sqrt()
如果想知道某个int c是否满足a^ 2+ b^2=c,我们只需要枚举所有可能的a,b即可,时间复杂度为o(n ^2),但是有些枚举是没有必要的,因此我们可以使用sqrt()函数或者双指针来降低时间复杂度。
在枚举a的同时,用sqrt()找出b,如果sqrt(c-a^2)为整数((int)sqrt(c-a ^2)==sqrt(c-a ^2)即可),则证明b存在。注意:本题 ccc 的取值范围在 [0,231−1],因此在计算的过程中可能会发生 int型溢出的情况,需要使用 long型避免溢出。
bool judgeSquareSum(int c) {
for (long a = 0; a * a <= c; a++) {
double b = sqrt(c - a * a);
if (b == (int)b) {
return true;
}
}
return false;
}
方法2:双指针
不失一般性,可以假设 a≤b。初始时 a=0,b=sqrt( c),进行如下操作:
如果 a^ 2+b^ 2==c,我们找到了题目要求的一个解,返回 true;
如果 a^ 2+b^ 2<c ,此时需要将 a 的值加 1,继续查找;
如果 a^ 2+b^ 2>c,此时需要将 b 的值减 1,继续查找。
当 a=b 时,结束查找,此时如果仍然没有找到整数 a 和 b 满足a^ 2+b^ 2==c,则说明不存在题目要求的解,返回 false
bool judgeSquareSum(int c) {
long left = 0;
long right = (int)sqrt(c);
while (left <= right) {
long sum = left * left + right * right;
if (sum == c) {
return true;
} else if (sum > c) {
right--;
} else {
left++;
}
}
return false;
}