题目描述:
难度简单
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c。
示例1:
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5
示例2:
输入: 3
输出: False
题目链接:https://leetcode-cn.com/problems/sum-of-square-numbers/
思路:
1、因为要判断两个数平方和为一个整数,所以我们需要不断缩小范围,可以认为是从一个有序的数组中进行查找
2、找到两个数之间的以某种公式计算 得到 给定的目标值 【并且可以认为数组是有序的】 则使用双指针来解决
关键点:
1、 最重要的是右指针怎么取, 因为我们是要让后两数平方和等于c, 因此我们可以将右指针 等于 sqrt(c)
2、 考虑边界值
class Solution {
public:
bool judgeSquareSum(int c) {
if(c < 0) return false;
if(c == 0 || c == 1 || c == 2) return true;
// 最重要的是右指针怎么取, 因为我们是要让后两数平方和等于c, 因此我们可以将右指针 等于 sqrt(c)
int left = 0, right = sqrt(c);
while(left <= right){
// 考虑边界值,为了防止下面temp的值 大于 INT_MAX , 所以要做边界值判断
if(right*right > (INT_MAX - left*left)){
right--;
continue;
}
int temp = left*left + right*right;
if(temp > c) right--;
else if(temp == c) return true;
else left++;
}
return false;
}
};