Número Perfeito — Leetcode 507

Dec 16 2022
Link do problema original: https://leetcode.com/problems/perfect-number/ Neste problema, somos solicitados a determinar se um determinado número inteiro n é um número perfeito, definido como um número inteiro igual à soma de todos os seus números positivos divisores (excluindo o próprio n).

Link original do problema:https://leetcode.com/problems/perfect-number/

Neste problema, somos solicitados a determinar se um dado inteiro n é um número perfeito, definido como um inteiro igual à soma de todos os seus divisores positivos (excluindo o próprio n).

A maneira mais intuitiva de fazer isso é fazer um loop de 2 até n / 2 e rastrear a soma corrente. No entanto, não surpreendentemente, isso dá uma exceção de limite de tempo excedido para grandes números.

Então cheguei a uma solução mais rápida porque matematicamente, quando encontramos um fator, há sempre outro fator que lhe corresponde e que também deve fazer parte da soma (por exemplo, se n = 28 e partimos de 2, então 28 / 2 = 14 também deve ser um fator e podemos cortar o número de loops pela metade dessa maneira, pois podemos fechar a lacuna mais rapidamente). Esta é a solução aceita que eu criei:

class Solution {
    public boolean checkPerfectNumber(int num) {
        if (num == 1) {
            return false;
        }
        int sum = 1;
        int left = 2;
        int right = num / 2;
        while (left < right) {
            if (num % left == 0) {
                sum += left;
                sum += (num / left);
                right = num / left;
            }
            left++;
        }
        return sum == num;
    }
}