263. 丑数 (ugly number)

3,255 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

263. 丑数 题目描述:丑数 就是只包含质因数 23 和 5 的正整数。给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。n[231,2311] n \in [-2^{31}, 2^{31} - 1]

示例1示例2示例3
输入n=6n = 6
输出truetrue
解释6=2×36 = 2 × 3
输入n=1n = 1
输出truetrue
解释11 没有质因数,因此它的全部质因数是 {2, 3, 5} 的空集。习惯上将其视作第一个丑数。
输入n=14n = 14
输出falsefalse
解释1414 不是丑数,因为它包含了另外一个质因数 77

本文是 264. 丑数2 的引导篇。

因式分解

  1. 首先确定,如果 n0n \le 0,那么 nn 就一定不是丑数,返回 falsefalse 即可。

  2. 其次,如果 nn 是丑数,如果我们不断尝试让 n÷235n \div 2、3、5,最后一定会得到 11

    解释:如果 nn 是丑数,那么 nn 一定可以分解成 n=2a×3b×5cn=2^a×3^b×5^c,其中 aabbcc 取整数(可以为 00)。可以先让 nn 不断 ÷2\div 2,直到 nn 变成 n=3b×5cn = 3^b×5^c,同理,再不断 ÷3÷5\div 3、\div 5,直到 nn 最终变成 11

  3. 如果 nn 不是丑数,即不能因式分解成 2352、3、5 元素的乘积,或者可以分解成 2352、3、5 元素的乘积,但同时存在非 2352、3、5 的因子。

    解释:如果 nn 不是丑数,那么 nn 一定可以分解成 n=2a×3b×5c×dn = 2^a×3^b×5^c \times d,其中 a、b、c取整数(可以为0),dd 是非 12351、2、3、5 的整数。让 nn 尝试 ÷2÷3÷5\div 2、\div 3、\div 5 之后,最终 nn 恒等于 dd,又因为 d1d \neq 1,所以用最终计算后的 nn11 比较即可知道原始的 nn 是不是丑数。

    同时除法存在交换律,所以先 ÷2\div 2,还是 先 ÷3÷5\div 3、\div 5 都没有关系,不会影响最终结果。

代码示例

/**
 * 空间复杂度 O(1)
 * 时间复杂度 O(logn)
 */
function isUgly(n: number): boolean {
    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;
};