Description

Given an integer n, return true if it is a power of three. Otherwise, return false.

An integer n is a power of three, if there exists an integer x such that n == 3x.

Example 1:

Input: n = 27Output: trueExplanation: 27 = 33

Example 2:

Input: n = 0Output: falseExplanation: There is no x where 3x = 0.

Example 3:

Input: n = -1Output: falseExplanation: There is no x where 3x = (-1).

Constraints:

-2^31 <= n <= 2^31 - 1

Follow up: Could you solve it without loops/recursion?

Solution

Binary Search

Search all the possible numbers for the power of 3.

Time complexity: o ( log ⁡ n )o(\log n)o(logn)
Space complexity: o ( 1 )o(1)o(1)

Note: Use 20 as the initial value for right, because 3^20 is larger than integer.

Prime factorization

This can be used to any other prime numbers as well. Since 3 is prime. 3^19 is its own unique prime factorization. Hence it is only divisible by its 20 factors, all of which are in the form of 3^n, where n = 0,1,…19.
On the other hand, 4^19 is not its own unique prime factorization. 4^19 = 2^38. (19 in this example is arbitrary)

Ref: https://leetcode.com/problems/power-of-three/solutions/77856/1-line-java-solution-without-loop-recursion/comments/1186997

Time complexity: o ( 1 )o(1)o(1)
Space complexity: o ( 1 )o(1)o(1)

Code

Binary Search

class Solution:def isPowerOfThree(self, n: int) -> bool:if n <= 0:return Falseleft, right = 0, 19while left < right:mid = (left + right) >> 1if math.pow(3, mid) < n:left = mid + 1else:right = midreturn math.pow(3, (left + right) >> 1) == n

Prime Factorization

class Solution:def isPowerOfThree(self, n: int) -> bool:# 1162261467 is 3 ^ 19return n > 0 and 1162261467 % n == 0