寒假闲来无事干?不如天天刷刷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 的所有正因子。
输入:num = 6
输出:true
输入:num = 496
输出:true
输入:num = 8128
输出:true
输入: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;
}
};



