leetcode 319. 灯泡开关

初始时有 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则打开,如果打开则关闭)。第 i 轮,你每 个灯泡切换一次开关。 对于第 轮,你只切换最后一个灯泡的开关。 找出 轮后有多少个亮着的灯泡。

示例:

输入: 3
输出: 1 
解释: 
状态off表示灯泡关闭,on表示开启。
初始时, 灯泡状态 [off, off, off].
第一轮后, 灯泡状态 [on, on, on].
第二轮后, 灯泡状态 [on, off, on].
第三轮后, 灯泡状态 [on, off, off]. 

你应该返回 1,因为只有一个灯泡还亮着。
 
 

首先模拟法,一个01数组来进行间隔开关,最后对数组求和。

时间复杂度O(n^2)果然超时了。。。

我就知道没那么容易。

考虑n个1的数组进行0,1转换,全部设为1已经是第一轮迭代了,我们相当于从第二轮迭代开始。

因为每个元素只有两个值。所以当这个元素经历偶数次变换就还是1,经历奇数次变换就是0。

说实话,我想到这但依然没有得到正确答案,我参考了别人的答案后豁然开朗。

基于奇数偶数次变换这个想法,我们考虑1~n这些灯泡怎么样可以被变换:

对于第二轮变换开始直到第n轮变换的第i次变换,如果这个i是标号的因子,那么一定会变。

所以等价于:“数字k(第k个灯泡)有多少个从2~k的因子”。

比如:8在i=2,4,8时经历了变换,所以n=8时最后8号灯泡是灭了的(可以拿纸笔试试)。

我们考察任意一个n,比如100。

100的因子有(大于等于2 的):2,4,5,10,20,25,50,100。

也就是说它经历8次变换,是1,实际上我们可以因数分为几组,因为2,50一组,4,25一组,5,20一组,剩下的100要和10一组了。

我们发现规律:如果平方根也在因子中,那么会有偶数次变换,否则因子n只能单独一组,这是因为对于一个数字来说,如果没有平方根当因子,那么算上因子1,总是成对出现的,平方根因子因为其特殊性,将因子个数变成不成对的。

所以,结论:最终变换得到1的灯泡是平方数编号的。

等价于求:1-n里平方数的个数

等价于:int(sqrt(n))

代码太简单了就不贴了。




猜你喜欢

转载自blog.csdn.net/weixin_37373020/article/details/80605810