美文网首页
Swift - LeetCode - 3 的幂

Swift - LeetCode - 3 的幂

作者: 晨曦的简书 | 来源:发表于2022-08-28 20:46 被阅读0次

    题目

    给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true;否则,返回 false

    整数 n3 的幂次方需满足:存在整数 x 使得 n == 3^x

    示例 1:

    • 输入: n = 27
    • 输出: true

    示例 2:

    • 输入: n = 0
    • 输出: false

    示例 3:

    • 输入: n = 9
    • 输出: true

    示例 4:

    • 输入: n = 45
    • 输出: false

    提示:

    • -2^{31} <= n <= 2^{31} - 1

    方法一:试除法

    思路及解法

    我们不断地将 n 除以 3,直到 n=1。如果此过程中 n 无法被 3 整除,就说明 n 不是 3 的幂。

    本题中的 n 可以为负数或 0,可以直接提前判断该情况并返回 \text{False},也可以进行试除,因为负数或 0 也无法通过多次除以 3 得到 1

    代码

    class Solution {
        func isPowerOfThree(_ n: Int) -> Bool {
            if n <= 0 {
                return false
            }
    
            var n = n
            while n % 3 == 0 {
                n /= 3
            }
    
            return n == 1
        }
    }
    

    复杂度分析

    • 时间复杂度:O(\log n)。当 n3 的幂时,需要除以 3 的次数为 \log_3 n = O(\log n);当 n 不是 3 的幂时,需要除以 3 的次数小于该值。

    • 空间复杂度:O(1)

    方法二:判断是否为最大 3 的幂的约数

    思路及解法

    我们还可以使用一种较为取巧的做法。

    题目要求不能使用循环或递归来做,而传参 n 的数据类型为 int,这引导我们首先分析出 int 范围内的最大 3 次幂是多少,约为 3^{19} = 1162261467

    如果 n3 的幂的话,那么必然满足 n * 3^k = 1162261467,即 n1162261467 存在倍数关系。

    因此,我们只需要判断 n 是否为 1162261467 的约数即可。

    与方法一不同的是,这里需要特殊判断 n 是负数或 0 的情况。

    注意:这并不是快速判断 x 的幂的通用做法,当且仅当 x 为质数可用。

    代码

    class Solution {
        func isPowerOfThree(_ n: Int) -> Bool {
            return n > 0 && 1162261467 % n == 0
        }
    }
    

    复杂度分析

    • 时间复杂度:O(1)

    • 空间复杂度:O(1)

    相关文章

      网友评论

          本文标题:Swift - LeetCode - 3 的幂

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