2022-4-16 Leetcode 633. Suma de cuadrados

inserte la descripción de la imagen aquí
La primera versión usaba punteros dobles, pero provocó un desbordamiento.
inserte la descripción de la imagen aquí

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Supongo que te gusta

Origin blog.csdn.net/weixin_51187533/article/details/124209406
Recomendado
Clasificación