指尖劃過的軌跡,藏着最細膩的答案~

題目:

給你一個整數 n ,如果你可以將 n 表示成若干個不同的三的冪之和,請你返回 true ,否則請返回 false 。

對於一個整數 y ,如果存在整數 x 滿足 $y == 3^x$ ,我們稱這個整數 y 是三的冪。

示例 1:

輸入:n = 12
輸出:true
解釋:$12 = 3^1 + 3^2$

示例 2:

輸入:n = 91
輸出:true
解釋:$91 = 3^0 + 3^2 + 3^4$

示例 3:

輸入:n = 21
輸出:false

提示:

$1 <= n <= 10^7$

分析:

示例 1 的 n=12=9+3。其中 9 是最大的小於等於 12 的 3 的冪。

如果不從 12 中分出 9,那麼 12 必須表示為更小的 3 的冪之和,即 12=(3+3+3)+3,相當於把 9 分成了若干個相同的 3。題目要求不能有相同元素,3 必須繼續分解,但這會得到更多的 3 的冪,即 3=1+1+1。所以,如果不從 12 中分出 9,就無法滿足題目要求。

一般地,必須分解出小於等於 n 的最大 3 的冪 $3^k$,然後問題變成 $n′=n−3^k$,這是一個規模更小的子問題。該方法也是把 n 表示為三進制的方法之一。例如 $12=110_{(3)}$,$21=210_{(3)}$。

示例 3 的 n=21=9+9+3,一旦出現兩個相同的 3 的冪,即使把其中一個 9 繼續分成更小的 3 的冪,仍然會有相同的 3 的冪。這意味着如果 n 的三進製表示中有數字 2,那麼 n 就無法表示成若干個不同的三的冪之和。否則,n 可以表示成若干個不同的三的冪之和。

作者:靈茶山艾府

參考代碼:

class Solution {
public:
    bool checkPowersOfThree(int n) {
        while (n) {
            if (n % 3 == 2) {
                return false;
            }
            n /= 3;
        }
        return true;
    }
};