題目
給定一個(gè)整數(shù),寫一個(gè)函數(shù)來判斷它是否是 的冪次方咏尝。如果是格侯,返回 ;否則押袍,返回 。
整數(shù) 是 的冪次方需滿足:存在整數(shù) 使得
示例 1:
- 輸入:
n = 27
- 輸出:
true
示例 2:
- 輸入:
n = 0
- 輸出:
false
示例 3:
- 輸入:
n = 9
- 輸出:
true
示例 4:
- 輸入:
n = 45
- 輸出:
false
提示:
方法一:試除法
思路及解法
我們不斷地將 除以 凯肋,直到 谊惭。如果此過程中 無法被 整除,就說明 不是 的冪侮东。
本題中的 可以為負(fù)數(shù)或 圈盔,可以直接提前判斷該情況并返回 ,也可以進(jìn)行試除苗桂,因?yàn)樨?fù)數(shù)或 也無法通過多次除以 得到 药磺。
代碼
class Solution {
func isPowerOfThree(_ n: Int) -> Bool {
if n <= 0 {
return false
}
var n = n
while n % 3 == 0 {
n /= 3
}
return n == 1
}
}
復(fù)雜度分析
時(shí)間復(fù)雜度:。當(dāng) 是 的冪時(shí)煤伟,需要除以 的次數(shù)為 癌佩;當(dāng) 不是 的冪時(shí),需要除以 的次數(shù)小于該值便锨。
空間復(fù)雜度:围辙。
方法二:判斷是否為最大 3 的冪的約數(shù)
思路及解法
我們還可以使用一種較為取巧的做法。
題目要求不能使用循環(huán)或遞歸來做放案,而傳參 的數(shù)據(jù)類型為 姚建,這引導(dǎo)我們首先分析出 范圍內(nèi)的最大 次冪是多少,約為 吱殉。
如果 為 的冪的話掸冤,那么必然滿足 ,即 與 存在倍數(shù)關(guān)系友雳。
因此稿湿,我們只需要判斷 是否為 的約數(shù)即可。
與方法一不同的是押赊,這里需要特殊判斷 是負(fù)數(shù)或 的情況饺藤。
注意:這并不是快速判斷 的冪的通用做法,當(dāng)且僅當(dāng) 為質(zhì)數(shù)可用流礁。
代碼
class Solution {
func isPowerOfThree(_ n: Int) -> Bool {
return n > 0 && 1162261467 % n == 0
}
}
復(fù)雜度分析
時(shí)間復(fù)雜度:涕俗。
空間復(fù)雜度:。