leetcode 319 燈泡開關

【題目】

初始時有 n 個燈泡關閉。 第 1 輪,你打開所有的燈泡。 第 2 輪,每兩個燈泡你關閉一次。 第 3 輪,每三個燈泡切換一次開關(如果關閉則開啓,如果開啓則關閉)。第 i 輪,每 i 個燈泡切換一次開關。 對於第 n 輪,你只切換最後一個燈泡的開關。 找出 n 輪後有多少個亮着的燈泡。

示例:

輸入: 3
輸出: 1 
解釋: 
初始時, 燈泡狀態 [關閉, 關閉, 關閉].
第一輪後, 燈泡狀態 [開啓, 開啓, 開啓].
第二輪後, 燈泡狀態 [開啓, 關閉, 開啓].
第三輪後, 燈泡狀態 [開啓, 關閉, 關閉]. 

你應該返回 1,因爲只有一個燈泡還亮着。

【暴力法】

  1. 創建一個數組,長度爲n,裏面的元素都爲1,表示打開了所有的燈泡
  2. 遍歷2到n,當爲2時,將數組中index爲2的倍數的元素值進行翻轉
  3. 直到遍歷到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

【規律方法】

  1. 轉而觀察某個位置,看看某個位置是怎樣變化的,什麼條件下會翻轉
  2. 第18個燈泡會在1,2,3,6,9,18輪翻轉。
  3. 第36個燈泡會在1,2,3,4,6,9,12,18,36輪翻轉。
  4. 規律顯而易見,只有在輪數是該位置因數的時候纔會執行翻轉操作。
  5. 所以只要找到該位置的所有因數個數,我們就知道該位置翻轉了多少次。
  6. 更進一步的,除了完全平方數,因數都是成對出現的,這意味着實際起到翻轉作用(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))

【結果】

發佈了27 篇原創文章 · 獲贊 2 · 訪問量 1773
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章