1. 程式人生 > >319. Bulb Switcher的C++解法

319. Bulb Switcher的C++解法

這個題我一開始注意到的是,只有數字含有某因子a的時候才會在第a次操作被改變狀態,那麼計算這個數字有多少因子,如果是奇數就說明最後的燈是開著的,如果是偶數則是關的。

class Solution {
public:
	int countFactor(int n){
		if (n == 1) return 1;
		int sum = 0;
		for (int i = 1; i<sqrt(n); i++)
			if (n%i == 0) sum = sum + 2;
		if (int(sqrt(n))*int(sqrt(n)) == n) sum++;
		return sum;
	}
	int bulbSwitch(int n) {
		int res = 0;
		for (int i = 1; i <= n; i++)
			if (countFactor(i) % 2 == 1) res++;
		return res;
	}
};

然後這樣做會報超出時間複雜度。其實再往深想一步,每個數的因數中前面的數改變了燈泡狀態,後面的數又變回去了,等於燈泡的狀態沒有發生變化,只有完全平方數,開方時只得到一個因數,沒有對應其它的狀態能將其變回去了,所以燈泡就一直是點亮狀態的。所以所有平方數都有這麼一個相等的因數對,即所有平方數的燈泡都將會是點亮的狀態。

class Solution {
public:
    int bulbSwitch(int n) {
        int res = 1;
        while (res * res <= n) ++res;
        return res - 1;
    }
};

進一步簡化:

class Solution {
public:
    int bulbSwitch(int n) {
        return sqrt(n);
    }
};