ETH官方钱包

切換
舊版
前往
大廳
主題

[LeetCode] 319. Bulb Switcher

テリ君(桃夫模式) | 2023-04-27 19:44:12 | 巴幣 8 | 人氣 218

這題我原本是用double for loop
但問題來了 很花時間 特別是 n 超大的時候
後來我問問Chatgpt
它的意思是我的時間複雜度 = O(n^2)
但實際上可以用 O(sqrt(n)) 就好了
然後就沒有然後了

原本的code

class Solution(object):
    def bulbSwitch(self, n):
        x = []
        total = 0
        for _ in range(n):
            x.append(False)
        for i in range(1, n + 1):
            for j in range(1, n + 1):
                if j % i == 0:
                    x[j - 1] = not x[j - 1]
        for i in range(n):
            if x[i] == True:
                total += 1
        
        return total

和精良後的code
class Solution(object):
    def bulbSwitch(self, n):
        return int(n**0.5)
    

    

好喔
看來我的腦袋還在上古世紀
記錄個
然後這是時間複雜度的wiki
放著紀錄
這是時間複雜度看不同的演算法

以上

創作回應

G家遊民
像是8有 1 2 4 8四個, 9有1,3,9三個
所以亮的人都有奇數個不同的因數。
那甚麼數字會有奇數的因數呢?
只有完全平方數k=n^2才會有奇數個因數
(不然假設p是k的因數,一定有另外一個q,q*p==k)
2023-04-28 14:53:52
G家遊民
所以這個問題等價有幾個小於等於n的完全平方數
2023-04-28 14:54:36
G家遊民
你可以從1開始檢驗平方之後有沒有大於n,檢查到n開根號停止
或是二分搜根號n(因為是單調的)
2023-04-28 14:56:32
G家遊民
@貓狗喵 菇啊,這樣我建一個表把0到2^32-1開根號的值都存起來就O(1)解了
2023-04-28 14:58:51
テリ君(桃夫模式)
無法理解了QQ
2023-04-28 19:04:22
G家遊民
http://www.lomont.org/papers/2003/InvSqrt.pdf
硬體好噁心 ==
2023-04-28 15:02:50

更多創作