319. Bulb Switcher
1.开始采用数组,双重for循环,毫无意外地超时了
class Solution { public: int bulbSwitch(int n) { if(n <= 0) return 0; int *b = new int[n]; for(int i = 0; i < n; ++i) b[i] = 0; for(int step = 0; step < n; ++step) for(int index = step; index < n; index=index+step+1) b[index] = 1-b[index]; return count(b,n); } int count(int *a,int len) { int num = 0; for(int i = 0; i < len; ++i) if(a[i] == 1) ++num; return num; } };
2. 文章来源 http://m.blog.csdn.net/article/details?id=50511566
先看看以下规律:
第1个灯泡:1的倍数,会改变1次状态: off -> on
第2个灯泡:1的倍数,2的倍数,会改变2次状态: off -> on -> off
第3个灯泡:1的倍数,3的倍数,会改变2次状态: off -> on -> off
第4个灯泡:1的倍数,2的倍数,4的倍数,会改变3次状态: off -> on -> off -> on
第5个灯泡:1的倍数、5的倍数,会改变2次状态: off -> on -> off
第6个灯泡:1的倍数,2的倍数,3的倍数,6的倍数,会改变4次状态: off -> on -> off -> on -> off
第7个灯泡:1的倍数、7的倍数,会改变2次状态: off -> on -> off
第8个灯泡:1的倍数,2的倍数,4的倍数,8的倍数,会改变4次状态: off -> on -> off -> on -> off
第9个灯泡:1的倍数,2的倍数,4的倍数,会改变3次状态: off -> on -> off -> on
……
通过上面的描述可以发现,对于n = 2,3,5,6,7,8
,找到一个数的整数倍,总会找到对称的一个整数倍,例如 1 * 2
,就肯定会有一个 2 * 1
。因此这些编号的灯泡会改变偶数次,最终结果肯定为off
。
只有当n = 1,4,9
这类完全平方数,有奇数次变化,最终的灯泡都会 on
。
只要能得出以上结论,用一句代码就可以解决问题。
class Solution { public: int bulbSwitch(int n) { return (int)(n > 0 ? sqrt(n):0); } };