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%,可能是云琪造成的。