1. 程式人生 > >【LeetCode】 319. 燈泡開關

【LeetCode】 319. 燈泡開關

遞迴問題

  1. 題目介紹

初始時有 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);
    }
};