【題目】
初始時有 n 個燈泡關閉。 第 1 輪,你打開所有的燈泡。 第 2 輪,每兩個燈泡你關閉一次。 第 3 輪,每三個燈泡切換一次開關(如果關閉則開啓,如果開啓則關閉)。第 i 輪,每 i 個燈泡切換一次開關。 對於第 n 輪,你只切換最後一個燈泡的開關。 找出 n 輪後有多少個亮着的燈泡。
示例:
輸入: 3
輸出: 1
解釋:
初始時, 燈泡狀態 [關閉, 關閉, 關閉].
第一輪後, 燈泡狀態 [開啓, 開啓, 開啓].
第二輪後, 燈泡狀態 [開啓, 關閉, 開啓].
第三輪後, 燈泡狀態 [開啓, 關閉, 關閉].
你應該返回 1,因爲只有一個燈泡還亮着。
【暴力法】
- 創建一個數組,長度爲n,裏面的元素都爲1,表示打開了所有的燈泡
- 遍歷2到n,當爲2時,將數組中index爲2的倍數的元素值進行翻轉
- 直到遍歷到n,然後計算數組中1的個數
【性能分析】
超時:
【Python代碼】
def bulbSwitch(self, n: int) -> int:
num = [ 1 for i in range(n+1)]
for i in range(2,n+1):
m = i
while m <= n:
if num[m] == 0:
num[m] = 1
else:
num[m] = 0
m += i
number = 0
for i in num:
if i == 1:
number += 1
return number-1
【規律方法】
- 轉而觀察某個位置,看看某個位置是怎樣變化的,什麼條件下會翻轉
- 第18個燈泡會在1,2,3,6,9,18輪翻轉。
- 第36個燈泡會在1,2,3,4,6,9,12,18,36輪翻轉。
- 規律顯而易見,只有在輪數是該位置因數的時候纔會執行翻轉操作。
- 所以只要找到該位置的所有因數個數,我們就知道該位置翻轉了多少次。
- 更進一步的,除了完全平方數,因數都是成對出現的,這意味着實際起到翻轉作用(0->1)的,只有完全平方數而已。
【Python代碼】
class Solution:
def bulbSwitch(self, n: int) -> int:
return int(pow(n,0.5))
s = Solution()
n = 9
print(s.bulbSwitch(n))
【結果】