LeetCode 319. 燈泡開關
阿新 • • 發佈:2018-12-15
遞迴問題
- 題目介紹
初始時有 n 個燈泡關閉。 第 1 輪,你開啟所有的燈泡。 第 2 輪,每兩個燈泡你關閉一次。 第 3 輪,每三個燈泡切換一次開關(如果關閉則開啟,如果開啟則關閉)。第 i 輪,每 i 個燈泡切換一次開關。 對於第 n 輪,你只切換最後一個燈泡的開關。 找出 n 輪後有多少個亮著的燈泡。 示例: 輸入: 3 輸出: 1 解釋: 初始時, 燈泡狀態 [關閉, 關閉, 關閉]. 第一輪後, 燈泡狀態 [開啟, 開啟, 開啟]. 第二輪後, 燈泡狀態 [開啟, 關閉, 開啟]. 第三輪後, 燈泡狀態 [開啟, 關閉, 關閉]. 你應該返回 1,因為只有一個燈泡還亮著。
2.程式碼
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int bulbSwitch(int n){
int arr[n]={0}; //定義0表示開啟,1表示熄滅
int k=2;
while(k!=n)
{
for(int i=k-1;i<n;i+=k){
if(arr[i]==0)
arr[i]=1;
else
arr[i]=0;
}
k++;
}
if(arr[n-1]==0)
arr[n-1]=1;
else
arr[n-1]=0;
int c=0;
for(int i=0;i<n;i++)
if(arr[i]==0)
c+=1;
return c;
}
int main(){
int m;
while(cin>>m){
cout<<bulbSwitch(m)<<endl;
}
return 0;
}
以上程式碼可以實現功能,但是每一輪都要遍歷整個陣列,超出時間限制; 因此重新閱讀題目,採取其他簡潔的方法:
燈在改變奇數次狀態後是亮的,偶數次是滅的。 每盞燈狀態變換的次數其實是其編號的因數個數,而除了平方數外,所有正整數都有偶數個因數。 因此計算出1~n中有多少平方數即可
class Solution {
public:
int bulbSwitch(int n) {
return (int)sqrt(n);
}
};