题目链接: 丑数
有关题目
给你一个整数 n ,请你判断 n 是否为 丑数 。
如果是,返回 true ;否则,返回 false 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例 2:
输入:n = 8
输出:true
解释:8 = 2 × 2 × 2
示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
示例 4:
输入:n = 1
输出:true
解释:1 通常被视为丑数。
提示:
-2^31 <= n <= 2^31 - 1
题解
法一:递归
参考官方题解评论区下Rainsho
class Solution {
public:
bool isUgly(int n) {
if (n <= 0){
return false;
}
//递归终止条件->1 ~ 6皆为丑数
if (n <= 6){
return true;
}
if (n % 2 == 0) return isUgly(n / 2);
if (n % 3 == 0) return isUgly(n / 3);
if (n % 5 == 0) return isUgly(n / 5);
return false;
}
};
时间复杂度:O(log n),若为丑数每次至少除2,故除法运算次数不大于log n
空间复杂度:O(log n),同理递归调用栈的最大深度为log N
法二:数学
思路:
根据分解质因数的方法,
分解出原数n所含有的所有质因数2,3,5,
再判断剩下的数是否为1,如果为1,就代表该数仅仅由质因数2,3,5组成
代码一:
class Solution {
public:
bool isUgly(int n) {
if (n <= 0){
return false;
}
while(n % 2 == 0) n /= 2;
while(n % 3 == 0) n /= 3;
while(n % 5 == 0) n /= 5;
return n == 1;
}
};
时间复杂度:O(log n),为丑数,每次至少除2,故除的次数最大不超过O(log n)
空间复杂度:O(1)
代码二:
参考官方题解
class Solution {
public:
bool isUgly(int n) {
//根据丑数定义,丑数不为零,且不为负数
if (n <= 0){
return false;
}
//若n为丑数,则n = 2 ^ a * 3 ^ b * 5 ^ c;
vector<int> factors = {2, 3, 5};
for (auto& factor : factors){
while(n % factor == 0){
n /= factor;
}
}
return n == 1;
}
};