第一版,使用双指针,但是造成了溢出。
class Solution {
public:
bool judgeSquareSum(int c) {
vector<int> arr(c+1);
for(int i = 0;i < c+1;i++){
arr[i] = i;
}
int l = 0;
int r = c;
while(l <= r){
unsigned long long int num = arr[l] * arr[l] + arr[r] * arr[r];
if(num == c){
return true;
}else if(num > c){
r--;
}else {
l++;
}
}
return false;
}
};
主要是需要使用sqrt 来防止溢出和降低时间复杂度。
第二版,依然会溢出。
Line 11: Char 43: runtime error: signed integer overflow: 829921 + 2146654224 cannot be represented in type ‘int’ (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:20:43
class Solution {
public:
bool judgeSquareSum(int c) {
int a = sqrt(c);
vector<int> arr(a+1);
for(int i = 0;i < arr.size();i++){
arr[i] = i;
}
int l = 0,r = a;
while(l <= r){
long long num = arr[l]*arr[l] + arr[r]*arr[r];
if(num == c){
return true;
}else if(num > c){
r--;
}else{
l++;
}
}
return false;
}
};
第三版,将数组换成了long
class Solution {
public:
bool judgeSquareSum(int c) {
long a = sqrt(c);
vector<long> arr(a+1);
for(int i = 0;i < arr.size();i++){
arr[i] = i;
}
int l = 0,r = a;
while(l <= r){
long long num = arr[l]*arr[l] + arr[r]*arr[r];
if(num == c){
return true;
}else if(num > c){
r--;
}else{
l++;
}
}
return false;
}
};
看了下官方答案,发现没有必要使用数组
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-Solution
链接:https://leetcode-cn.com/problems/sum-of-square-numbers/solution/ping-fang-shu-zhi-he-by-leetcode-solutio-8ydl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。