La primera versión usaba punteros dobles, pero provocó un desbordamiento.
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;
}
};
Lo principal es usar sqrt para evitar el desbordamiento y reducir la complejidad del tiempo.
Segunda edición, todavía a rebosar.
Línea 11: Char 43: error de tiempo de ejecución: desbordamiento de entero con signo: 829921 + 2146654224 no se puede representar en type'int' (solution.cpp)
MEMS: 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;
}
};
La tercera versión, reemplaza la matriz con 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;
}
};
Después de leer la respuesta oficial, descubrí que no hay necesidad de usar una matriz
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。