LeetCode 507. Perfect Number

LeetCode 507

  • 0. 版权声明
  • 1. LeetCode 507
  • 2. 优化后的暴力求解
  • 3. Euclid-Euler 方法
  • 4. 代码
  • References

0. 版权声明

  • LeetCode 系列笔记来源于 LeetCode 题库1,在个人思考的基础之上博采众长,令鄙人受益匪浅;故今记此文,感怀于心,更多题解及代码,参见 Github2
  • 该系列笔记不以盈利为目的,仅用于个人学习、课后复习及交流讨论;
  • 如有侵权,请与本人联系([email protected]),经核实后即刻删除;
  • 本文采用 署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0) 协议发布;

1. LeetCode 507

  • 暴力求解:从1-n 逐个确认是否满足完美数的定义;No review required
    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( 1 ) O(1) O(1)
    • Time Limit Exceeded;
  • 优化后的暴力求解:
    • 时间复杂度: O ( n ) O(\sqrt{n}) O(n )
    • 空间复杂度: O ( 1 ) O(1) O(1)
  • Euclid-Euler 方法:No review required
    • 时间复杂度: O ( l o g   n ) O(log\space n) O(log n)
    • 空间复杂度: O ( l o g   n ) O(log\space n) O(log n)
  • 备注:n 为输入的数值;

2. 优化后的暴力求解

  • 求解流程:
    • “完美数”的因子成对出现,E.g. n u m ÷ i = j num\div i=j num÷i=j,因此可将暴力求解的时间复杂度从 O ( n ) O(n) O(n)降低至 O ( n ) O(\sqrt{n}) O(n )
  • 边界条件:
    • 当因子 i = n u m i=\sqrt{num} i=num 时,i 只能被累加1次;

3. Euclid-Euler 方法

  • 求解流程:参见维基百科3
  • 注意:对于“丑数”、“完美数”等问题,应尝试找出一种方法生成满足条件的数值,相较于暴力求解,可大幅度降低时间复杂度;

4. 代码

class Solution {
    public boolean checkPerfectNumber(int num) {
        if (num <= 0)
            return false;
        int sum = 0;
        for (int i = 1; i <= Math.sqrt(num); i++)
        {
            if (num % i == 0)
            {
                sum += i;
                if (num != Math.pow(i, 2))
                    sum += num / i;
            }
        }
        return sum - num == num;
    }
}

References


  1. https://leetcode-cn.com/problemset/all/. ↩︎

  2. https://github.com/hqpan/LeetCode. ↩︎

  3. https://en.wikipedia.org/wiki/Euclid%E2%80%93Euler_theorem. ↩︎

你可能感兴趣的:(LeetCode)