LeetCode 319. Bulb Switcher
阿新 • • 發佈:2018-11-07
題解
自然地會想到模擬開關的方法,開一個數組記錄開關情況,最後奇數者亮。
例如
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);
}