美文网首页LeetCode - 算法
Swift - LeetCode - 丑数

Swift - LeetCode - 丑数

作者: 晨曦的简书 | 来源:发表于2022-08-22 11:13 被阅读0次

    题目

    丑数 就是只包含质因数 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>0 时,若 n 是丑数,则 n 可以写成 n = 2^a \times 3^b \times 5^c 的形式,其中 a,b,c 都是非负整数。特别地,当 a,b,c 都是 0 时,n=1

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

    代码

    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(\log n)。时间复杂度取决于对 n 除以 2,3,5 的次数,由于每次至少将 n 除以 2,因此除法运算的次数不会超过 O(\log n)

    • 空间复杂度:O(1)

    方法二:数学(二)

    思路及解法

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

    代码

    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(\log n)

    • 空间复杂度:O(1)

    相关文章

      网友评论

        本文标题:Swift - LeetCode - 丑数

        本文链接:https://www.haomeiwen.com/subject/bkpbgrtx.html