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

56 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

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

力扣题目链接:leetcode.cn/problems/ch…

给你一个整数 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

也可直接看效率更高的方法二

方法一:二进制枚举

题目分析

314=4782969<107,315=14348907>1073^{14}=4782969<10^7, 3^{15}=14348907>10^7

因此,想要数个不同的33nn次幂组成nnn107n\leq 10^7),那么最多使用303˜143^0\~3^{14}1515个数

每个数有“选”与“不选”两种选择,因此最多有215=327682^{15}=32768种方案,可以枚举解决。

解题思路

那么,我们直接开辟一个数组,把所有的小于等于nn的“3的幂”放入数组

vector<int> three(1, 1);  // 初始值是1个1
while (three.back() < n) {
    three.push_back(three.back() * 3);
}

接下来,用一个整数statestate002len(three)2^{len(three)}枚举,statestate的第ii位为00则代表使用threethree数组中的第ii个数,否则代表不使用。

每个statestate代表一种方案,计算所有的方案中,是否有和为nn

int num = three.size(), to = 1 << num;
for (int state = 0; state < to; state++) {
    int s = 0;
    for (int j = 0; j < num; j++) {
        if (state & (1 << j)) {
            s += three[j];
        }
    }
    if (s == n)
        return true;
}
return false;

复杂度分析

  • 时间复杂度O(2log3n)O(2^{\log_3 n})
  • 空间复杂度O(log3n)O(\log_3 n)

AC代码

C++

class Solution {
public:
    bool checkPowersOfThree(int n) {
        vector<int> three(1, 1);
        while (three.back() < n) {
            three.push_back(three.back() * 3);
        }
        int num = three.size(), to = 1 << num;
        for (int state = 0; state < to; state++) {
            int s = 0;
            for (int j = 0; j < num; j++) {
                if (state & (1 << j)) {
                    s += three[j];
                }
            }
            if (s == n)
                return true;
        }
        return false;
    }
};

方法二:进制转换

我们只需要将nn转化为三进制,然后判断nn在三进制下是否有22

例如10=(101)310=(101)_3,那就说明10=30+3210=3^0+3^215=(120)315=(120)_3,那就说明15=32+2×3115=3^2+2\times3^1,需要两个313^1

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

AC代码

C++

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

同步发文于CSDN,原创不易,转载请附上原文链接哦~ Tisfy:letmefly.blog.csdn.net/article/det…