319. Bulb Switcher的C++解法
阿新 • • 發佈:2018-12-25
這個題我一開始注意到的是,只有數字含有某因子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);
}
};