326. Power of Three(easy)

1.题目要求判断一个数是否为3的k次幂,如果是则输出true,否则输出false

2.我们可以使用简单的递归进行判断,时间复杂度为O(logn),其中log的底数为3。代码如下:

class Solution {
public:
	bool isPowerOfThree(int n) {
		
		if (n < 3)
		{
			if (n == 1) return true;
			else return false;
		}
		else
		{
			if (n % 3 == 0)
				return isPowerOfThree(n / 3);
			else return false;
		}
	}
};

3.其中,题目额外提示,能不能使用非递归和非循环的方法实现。

我们来分析一下题目,题目中要求判断的数的类型为int,即最大为2^31-1,而3^k次方中,k会比31小,所以答案个数是非常有限的,我们把所有的列出来,如下:

1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907,43046721,129140163,387420489,1162261467

答案一共只有20个,我们可以直接判断n是否等于上面20个数中的某一个即可。

另外,再深入分析,我们可以看到,上述所有数都可以整除1162261467,1162261467是int类型中3的最大幂次方,它的质因数只有3,而其他小于1162261467的3的幂次方的质因数也只有3,如果包含了其他质因数,则这个数肯定不是3的幂次方。于是我们有了更简单的判断方法,判断n是否能被1162261467整除即可,代码如下:

class Solution {
public:
	bool isPowerOfThree(int n) {
		return n>0 ? !(1162261467 % n) : 0;
	}
};

 

Given an integer, write a function to determine if it is a power of three.

Follow up:
Could you do it without using any loop / recursion?

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注