最近是在研究双指针啊,leetcode刷的题都是这方面的。都记录在最近的文章里,大家有兴趣可以去我主页看看
LCP633 平方数之和
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
方法1:食我双指针啊
显然,这里是在给定范围内找找两个数字满足条件,双指针再合适不过了
//leetcode官方题解
class Solution {
public:
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;
}
};
这个方法是leetcode官方题解,效果如下
方法二,直接判断不挺好
class Solution {
public:
bool judgeSquareSum(int c) {
//对于单独情况,分个if就行,不然对所有情况编程,徒增开销
if (c == 0) return true;
//这里还有一种写法,不过每次都要多加一次计算,性能较差
/*
for(int a=1;a*a<=c;a++)
大家对比一下,是否多了一次计算?每个循环中多一次计算,
这个对效率的拖后腿是不能多想
*/
int sqc = (int)(sqrt(c));
for (int a = 1; a <= sqc; a++)
{
int b = (int)(sqrt(c - a * a));
if (a * a + b * b == c) return true;
}
return false;
}
};
这是俺的直接循环比较法