您的位置:首页 > 其它

LeetCode---Bulb Switcher解题分析

2016-06-30 21:45 288 查看
题意描述:给定n个灯泡,初始化全为off,第一趟全问部on,第二趟将每第二个off,第三趟将每第三个反转……第n趟将第n个反转,最后返回灯泡处于on的数目。给定n=3,则有以下过程:

开始时,3个灯泡[off, off, off];第一轮,3个灯泡[on, on, on];第二轮,3个灯泡[on, off, on];第三轮,3个灯泡[on, off, off]。所以最后返回1

解题思路一:该方法最容易想到,就是依次判断各个灯泡的最终状态,然后返回灯亮的个数。可以发现当n=1,2,3时都返回1;从4开始,依次判断当前灯是否亮,如果亮则计数加1

int bulbSwitcher(int n) {
if(n <= 0)
return 0;
int res = 1;
for(int i=4; i<=n; i++){
if(isOn(i))
res++;
}
return res;
}
boolean isOn(int k){//判断第k个灯是否亮着
//判断的方法就是从2到当前数k,如果出现k的因子,则其状态反转一次
boolean flag = true;
for(int i=2; i<=k; i++){
if(k % i == 0)
flag = !flag;
}
return flag;
}

解题思路二:上面的解题思路没有用到灯泡数n与反转次数的关系,从而导致了当n过大时运行超时,观察上面运行的结果:[1,3]---1;  [4,8]---2;  [9,15]---3;  [16,24]---4;  [25,35]---5;……发现从[i,i*(i+2)]---i

int bulbSwitcher2(int n){
if(n <= 0)
return 0;
else
return (int)Math.sqrt(n);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: