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);
    }
};

 

posted on 2016-03-12 12:32  菜鸟2s  阅读(142)  评论(0编辑  收藏  举报

导航