题目:263. 丑数
难度: 简单
题目:
给你一个整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ugly-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
丑数:把只包含质因子2,3和5的数称作丑数(Ugly Number)。
那么,只要分别对2、3、5求余数直到不可整除为止,最后的值如果是1就说明是丑数。并且对求余的次序并没有要求。同时,因为输入数据含有负数,所以n<=0都是false。
- 时间复杂度:O(logn)
- 空间复杂度:O(1)
解题代码
(1)直接求余
class Solution {
public:
bool isUgly(int n) {
//解题思路:首先除2,直到不能整除为止,然后除5到不能整除为止,然后除3直到不能整除为止。最终判断剩余的数字是否为1,如果是1则为丑数,否则不是丑数。
if(n <= 0)
return false;
while(n % 2 == 0)
{
n = n / 2;
}
while(n % 3 == 0)
{
n = n / 3;
}
while(n % 5 == 0)
{
n = n / 5;
}
return n == 1 ? true : false;
}
};
(2)递归
class Solution {
public:
bool isUgly(int n) {
if(n <= 0)
return false;
if(n == 1)
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;
}
};
解题感悟
求解丑数,逐个求余即可。最好明白质因子等数学概念。