leetcode 319 灯泡超时

灯泡到底亮几盏 ?

悲惨的心路历程

刚开始在题目上纠结了好久(语文理解力无能o(╥﹏╥)o)

题目有言:
每 2 个灯泡切换一次开关

我挠头:
那是要两个灯泡一起换吗?
还是隔两个灯泡换第三个灯泡吗?
回头看看样例…这都对不上啊

最后终于明白了
两个灯泡一组,换组内的最后一个灯泡
留下了恍然大悟的泪水

开始解题

我思考一番

第n轮 对n的倍数进行开关操作

这不找因子吗?

对于1~n的每一盏灯来说
偶数个因子 – 最后关
奇数个因子 – 最后开
例如
第四盏灯-- 因子为 1,2,4(奇数个)
第一轮开
第二轮关
第四轮开

然后我
就老老实实的去找1~n的每个数的因子个数了
意料之中 (* ̄︶ ̄)
卡在n = 99999 的样例
成功 超时 (多么痛的领悟)
每个数都去找因子 太耗时了

咋办呢?
回到开始
既然因子的奇偶有影响开关
那什么影响因子的奇偶个数呢?

关键来了

因子是 成对出现
只有 平方数 会出现奇数个因子

战况瞬间明了
只要找1~n内平方数的个数就好啦!
搞定!

总结:还是要注意 观察特征抓住重点

代码如下:

class Solution {
public:
    int bulbSwitch(int n) {
         int cnt = 0;
         for (int i = 1; i <= sqrt(n); ++i) 
             if (i * i <= n) cnt++;      //寻找n内的平方数
         return cnt;
    }
};
发布了34 篇原创文章 · 获赞 0 · 访问量 595

猜你喜欢

转载自blog.csdn.net/Luyoom/article/details/103448572