栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode训练507.完美数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode训练507.完美数

寒假闲来无事干?不如天天刷刷LeetCode涨涨知识,本来前些日子22考研结束后格外焦虑(我是23考研的),27号晚上看了汤家凤老师直播后,突然发现考研距离我越来越近了,有人说这个寒假就得开始好好准备......emmmm因人而异吧,确实给我整焦虑了,思来想去不如先放松的同时多学学数据结构,不管考哪个学校反正数据结构是肯定要学的!下面进入正题!

不知道为什么LeetCode题库出现的第一道题不是第1题而是这道507题,标记为简单,但是只有48%的通过率,点进去以后读完题,评论区的解法没把我笑死,然后看了一下解析,这居然是一种正确解法红红火火恍恍惚惚或或!!!

507.完美数

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 n, 如果是完美数,返回 true,否则返回 false

示例 1:

输入:num = 28
输出:true
解释:28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。

示例 2:

输入:num = 6
输出:true

示例 3:

输入:num = 496
输出:true

示例 4:

输入:num = 8128
输出:true

示例 5:

输入:num = 2
输出:false

提示:

1 <= num <=

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-number
 

分析

对于输入的整数n,我们可以用枚举法找到他的所有 正因子 ,并累加在一个变量sum中,只需要最后判断sum是否等于n,即可判断输入的整数n是否为完美数,我们只需要枚举不超过的整数即可,因为对于每一个小于的正因子,他一定与一个大于的因子相乘才会等于n,在筛选过程中需要注意:

1、对于整数1,因为完美数定义在相加的因子中要排除自身,所以1不是完美数,需要单独处理

2、因为要排除自身,所以除了1之外的每一个整数都有一个单独的正因子1

3、当n为平方数时,其平方根也是一个单独的正因子,在计算时因避免重复加该值

class Solution {
public:
    bool checkPerfectNumber(int num) {
        if(num == 1)
        return false;
        int sum = 1;
        for(int d = 2; d * d < num; d++){
            if(num%d == 0){
            sum += d;
            if(d * d != num)
            sum += num/d;
            }
        }
        return sum == num;
    }
};

 代码时间复杂度为,空间复杂度为

先前提到评论区的解法格外搞笑,但最后发现,原因居然是因为题目范围内的完美数只有 6, 28, 496, 8128, 33550336 这5个,故完全可以通过判断输入的整数n是否为这5个数字来解决

class Solution {
public:
    bool checkPerfectNumber(int num) {
        return num == 6 || num == 28 || num == 496 || num == 8128 || num == 33550336;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685726.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号