1780. 判断一个数字是否可以表示成三的幂的和
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天
题目描述:
给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。
输入: n = 12
输出: true
解释: 12 = 31 + 32
解题思路:
方法1:进制转换
我们可以将数字n转换成3进制。在做进制运算中,对3取余数操作,得到0或1时,则满足3进制的情况,返回true操作。如果得到余数不为为0或1时,不满足情况,则返回false。以下是图片解析:
代码实现:
class Solution {
public boolean checkPowersOfThree(int n) {
///用这个数字除以3
while(n > 0){
if(n%3 == 2){
return false;
}
n /= 3;
}
return true;
}
}
方法2:贪心算法
在刷题的时候看见了使用贪心的思路去解决这个问题。他通过题目限制的数量级- 1 <= n <= 10^7
去计算出在这一区的10^7中内所有的3的幂数,在题目的条件下又限定了若干个不同的三的幂之和,使用贪心法,从大到小去遍历,用最大的这个10^7中所有3的幂数减去小于给定数字的幂,依次计算。重复步骤,
这种解法的思路来源于:leetcode.cn/u/han-bu-yu…
class Solution {
int max[] = new int[16];
public boolean checkPowersOfThree(int n) {
// 3^15=14348907 3^14=4782969
max[0] = 1;
for(int i=1;i<16;i++){
max[i] = max[i-1]*3;
}
int last = 15;
while(n!=0){
boolean flag = false;
for(int i=last; i>=0; i--){
if(max[i] <= n){
n = n-max[i];
last = i-1;
flag = true;
break;
}
}
if(last < 0 && !flag) return false;
}
return true;
}
}