1. 程式人生 > >LeetCode 319. Bulb Switcher

LeetCode 319. Bulb Switcher

題解

自然地會想到模擬開關的方法,開一個數組記錄開關情況,最後奇數者亮。
例如

int bulbSwitch(int n) {
        vector<int> cot(n+1,1);
        int res=0;
        if(n==1) return 1;
        for(int pos=1;pos<=n;pos++){
            for(int k=2;k<=n;k++)
                if(pos%k==0) cot[pos]++;
            if(cot[pos]%2 ==
1) res++; } return res; }

正確,但是這個O(n^2)方法超時。
怎麼改進,注意到這一點每個位置 i 被開關的次數上面的演算法是

for(k=2:n)  
	if(i%k == 0)
		cot[i]++; 

我們恰好在求的是數i的公因數的數量,i有奇數公因數等價於最後數為奇。
而一般而言任何數都有偶數個公因數,只有一種數有奇數個公因數,即平方數
如 1,2,9,16。。。
所以這道題等價為求1-n內有多少平方數

for(int i=1;i*i<=n;i++)
	res++;

但這還不是最簡,可證得 1-n內平方數數量恰等於 sqrt(n)。。
所以最後答案就一句話。

int bulbSwitch(int n) {
    return sqrt(n);
}