Swift - LeetCode - 3 的幂

·  阅读 489

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

题目

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

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

提示:

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

方法一:试除法

思路及解法

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

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

代码

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(logn)O(\log n)。当 nn33 的幂时,需要除以 33 的次数为 log3n=O(logn)\log_3 n = O(\log n);当 nn 不是 33 的幂时,需要除以 33 的次数小于该值。

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

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

思路及解法

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

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

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

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

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

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

代码

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

复杂度分析

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

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

分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改