leetcode每日一题系列-3的幂-「递归」-「数学」-「打表」

179 阅读1分钟

leetcode-326-3的幂

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

[题目描述]

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

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

 

示例 1:

输入:n = 27 输出:true 示例 2:

输入:n = 0 输出:false 示例 3:

输入:n = 9 输出:true 示例 4:

输入:n = 45 输出:false  

提示:

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

思路一:递归

  • 递归函数求解即可
  • 分两个条件进行判断
    • n == 0 直接返回false
    • 否则判断是否能够被3整除
public boolean isPowerOfThree(int n) {
            if (n == 0) return false;
            return n == 1 || (n % 3 == 0 && isPowerOfThree(n /= 3));
        }

  • 时间复杂度O(lgn)
  • 空间复杂度O(1)

思路二:数学

  • 可以通过判断是否能够被给定范围内的3的整数次幂最大值整除
  • 通过运算可以得知最大不超过3193^{19}
  • 判断即可
public boolean isPowerOfThree(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
  • 时间复杂度O(1)
  • 空间复杂度O(1)

思路三:打表

  • 算出范围内所有3的幂数
  • 存入hash,判断是否在结构体中即可
class Solution {
    static Set<Integer> set = new HashSet<>();
    static {
        int cur = 1;
        set.add(cur);
        while (cur <= Integer.MAX_VALUE / 3) {
            cur *= 3;
            set.add(cur);
        }
    }
    public boolean isPowerOfThree(int n) {
        return n > 0 && set.contains(n);
    }
}
  • 时间复杂度O(1)
  • 空间复杂度O(lgn)