Swift - LeetCode - 丑数

833 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情 

题目

丑数 就是只包含质因数 235 的正整数。

给你一个整数 n,请你判断 n 是否为 丑数。如果是,返回 true;否则,返回 false

示例 1:

  • 输入:n = 6
  • 输出:true
  • 解释:6 = 2 × 3

示例 2:

  • 输入:n = 1
  • 输出:true
  • 解释:1 没有质因数,因此它的全部质因数是 {2, 3, 5} 的空集。习惯上将其视作第一个丑数。

示例 3:

  • 输入:n = 14
  • 输出:false
  • 解释:14 不是丑数,因为它包含了另外一个质因数 7

方法一:数学

思路及解法

根据丑数的定义,0 和负整数一定不是丑数。

n>0n>0 时,若 nn 是丑数,则 nn 可以写成 n=2a×3b×5cn = 2^a \times 3^b \times 5^c 的形式,其中 aa,bb,cc 都是非负整数。特别地,当 aa,bb,cc 都是 00 时,n=1n=1

为判断 nn 是否满足上述形式,可以对 nn 反复除以 22,33,55,直到 nn 不再包含质因数 22,33,55。若剩下的数等于 11,则说明 nn 不包含其他质因数,是丑数;否则,说明 nn 包含其他质因数,不是丑数。

代码

class Solution {
    func isUgly(_ n: Int) -> Bool {
        var n: Int = n
        if n <= 0 {
            return false
        }
        let factors: [Int] = [2, 3, 5]
        for factor in factors {
            while n % factor == 0 {
                n /= factor
            }
        }
        return n == 1
    }
}

复杂度分析

  • 时间复杂度:O(logn)O(\log n)。时间复杂度取决于对 nn 除以 22,33,55 的次数,由于每次至少将 nn 除以 22,因此除法运算的次数不会超过 O(logn)O(\log n)

  • 空间复杂度:O(1)O(1)

方法二:数学(二)

思路及解法

判断当前 numnum 是否可以整除 22,如果可以将 num/2num/2;再判断是否可以整除 33,如果可以将 num/3num/3;判断是否可以整除 55,可以的话将 num/5num/5; 如果符合丑数只包含 223355 的定义则最终的 numnum 值一定等于 11

代码

class Solution {
    func isUgly(_ n: Int) -> Bool {
        var n: Int = n
        while n >= 1 {
            if n % 2 == 0 {
                n /= 2
            } else if n % 3 == 0 {
                n /= 3
            } else if n % 5 == 0 {
                n /= 5
            } else {
                break
            }
        }
        return n == 1
    }
}

复杂度分析

  • 时间复杂度:O(logn)O(\log n)

  • 空间复杂度:O(1)O(1)