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);
}
开始时,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);
}
相关文章推荐
- Java String
- Fast Randomized SVD
- Java SE-基本数据类型对应包装类
- 【Struts2】基础总结
- 文件上传
- 结构体
- 浅谈AOP
- css引用方式
- android 二维码 扫描与生成(内置)
- JDK配置
- 【中间件1】在Windows下搭建RocketMQ
- gradle项目与maven项目相互转化(转)
- C#/PHP调用有SoapHeader的WebService
- 搭建高可用mongodb集群—— 分片
- 传统javabean与spring中的bean的区别
- Half精度解析
- 栈与队列-顺序队列与链队列类模板的实现(数据结构基础 第3周)
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
- MySQL使用TEXT/BLOB类型的几点注意
- kqueue用法简介