跳转至

1780. 判断一个数字是否可以表示成三的幂的和

题目描述

给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。

对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。

 

示例 1:

输入:n = 12
输出:true
解释:12 = 31 + 32

示例 2:

输入:n = 91
输出:true
解释:91 = 30 + 32 + 34

示例 3:

输入:n = 21
输出:false

 

提示:

  • 1 <= n <= 107

解法

方法一:数学分析

思考

判断 \(n\) 能否写成若干互异三的幂之和。这等价于三进制里每一位只能是 \(0\)\(1\),不能出现 \(2\)

反复取 \(n\bmod 3\),若余数大于 \(1\) 则失败,否则整除 \(3\) 继续,直到 \(n\) 变为 \(0\)

我们发现,如果一个数 \(n\) 可以表示成若干个“不同的”三的幂之和,那么 \(n\) 的三进制表示中,每一位上的数字只能是 \(0\) 或者 \(1\)

因此,我们将 \(n\) 转换成三进制,然后判断每一位上的数字是否是 \(0\) 或者 \(1\)。如果不是,那么 \(n\) 就不可以表示成若干个三的幂之和,直接返回 \(\textit{false}\);否则 \(n\) 可以表示成若干个三的幂之和,返回 \(\textit{true}\)

时间复杂度 \(O(\log_3 n)\),空间复杂度 \(O(1)\)

1
2
3
4
5
6
7
class Solution:
    def checkPowersOfThree(self, n: int) -> bool:
        while n:
            if n % 3 > 1:
                return False
            n //= 3
        return True
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution {
    public boolean checkPowersOfThree(int n) {
        while (n > 0) {
            if (n % 3 > 1) {
                return false;
            }
            n /= 3;
        }
        return true;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution {
public:
    bool checkPowersOfThree(int n) {
        while (n) {
            if (n % 3 > 1) return false;
            n /= 3;
        }
        return true;
    }
};
1
2
3
4
5
6
7
8
9
func checkPowersOfThree(n int) bool {
    for n > 0 {
        if n%3 > 1 {
            return false
        }
        n /= 3
    }
    return true
}
1
2
3
4
5
6
7
function checkPowersOfThree(n: number): boolean {
    while (n) {
        if (n % 3 > 1) return false;
        n = Math.floor(n / 3);
    }
    return true;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
impl Solution {
    pub fn check_powers_of_three(n: i32) -> bool {
        let mut n = n;
        while n > 0 {
            if n % 3 > 1 {
                return false;
            }
            n /= 3;
        }
        true
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Solution {
    public bool CheckPowersOfThree(int n) {
        while (n > 0) {
            if (n % 3 > 1) {
                return false;
            }
            n /= 3;
        }
        return true;
    }
}

评论