leetcode 1780(贪心法解决)

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

中等

48

相关企业

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

通过次数

11.6K

提交次数

16.3K

通过率

71.0%

题解:官方思路是使用三进制求解。

方法一:进制转换
思路与算法

我们可以将 nnn 转换成 333 进制。如果 nnn 的 333 进制表示中每一位均不为 222,那么答案为 True\text{True}True,否则为 False\text{False}False。

例如当 n=12n=12n=12 时,12=(110)312 = (110)_312=(110) 
3

 ,满足要求;当 n=21n=21n=21 时,21=(210)321 = (210)_321=(210) 
3

 ,不满足要求。

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

作者:力扣官方题解
链接:https://leetcode.cn/problems/check-if-number-is-a-sum-of-powers-of-three/solutions/2011470/pan-duan-yi-ge-shu-zi-shi-fou-ke-yi-biao-0j5k/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我使用了贪心法,看到题解里面没有人提到这种做法:

题目要求若干不相同的3的次幂,正是这个要求让贪心法可以正确解答。首先构建一个3的次幂的数组,然后将判断的数字与3的次幂比较,大于哪个就减去哪个,然后继续比较,(这里要注意剪枝,也就是减去的数字不能再次使用,我重新赋值了9999999)知道==0或者超出比较次数,返回。==0表示可以,超出次数则不可。

class Solution {
public:
    bool checkPowersOfThree(int n) {
        int table3[15]={1,3,9,27,81};
        for(int i=1;i<15;i++)
        {
            table3[i]=3*table3[i-1];
        }
        int count=0;
        while(n>0)
        {
            count++;
            for(int i=14;i>=0;i--)
            {
                if(n>=table3[i])
                {
                    n-=table3[i];
                    table3[i]=99999990;
                    break;
                }
            }
            if(count>=15)
                return false;
        }
        return true;
    }
};

时间0 ms

击败

100%

内存5.8 MB

击败

52.86%

我的时间复杂度最大为O(225),也就是常数时间,所以时间复杂度击败了100%,可能是云琪造成的。

猜你喜欢

转载自blog.csdn.net/weixin_41579872/article/details/128247333
今日推荐