其他分享
首页 > 其他分享> > leetcode(力扣) 319. 灯泡开关 (暴力模拟) (数学推论)

leetcode(力扣) 319. 灯泡开关 (暴力模拟) (数学推论)

作者:互联网

题目在这:https://leetcode-cn.com/problems/bulb-switcher/

法一(暴力):

这道题题目描述的就很清楚,由于第一轮和第二轮都是固定的,所以可以直接从第三轮开始,n如果等于0或者1,就直接返回0或者1。
从第三轮开始,N轮时,下标为N-1的灯变换开关。所以直接写两层for就行了。

完整代码

		if n == 0:
            return 0
        if n == 1:
            return 1
        # 初始 [关闭, 关闭,关闭, 关闭,]
        # 第一轮 [开启, 开启,开启,开启]
        # 第二轮 [开启, 关闭,开启,关闭]
        # 第三轮 [开启, 关闭,关闭, 关闭]
        # 第四轮 [开启,关闭,关闭,开启]
        # 先设置初始数组
        res = [True for i in range(n)]
        time = n
        for i in range(2, n+1):
            j = 1
            while i * j -1 < len(res):
                if res[i * j - 1]:
                    res[i * j - 1] = False
                    n -=1
                else:
                    res[i * j - 1] = True
                    n +=1
                # res[i * j - 1] = False if res[i * j - 1] else True
                j += 1
        return n

超时了。。。。。

法二(数学规律):

我们直接输出 n从0-999的时候每次等亮的个数。

第 0 轮亮着的灯数为 0
第 1 轮亮着的灯数为 1
第 2 轮亮着的灯数为 1
第 3 轮亮着的灯数为 1
第 4 轮亮着的灯数为 2
第 5 轮亮着的灯数为 2
第 6 轮亮着的灯数为 2
第 7 轮亮着的灯数为 2
第 8 轮亮着的灯数为 2
第 9 轮亮着的灯数为 3
第 10 轮亮着的灯数为 3
第 11 轮亮着的灯数为 3
第 12 轮亮着的灯数为 3
第 13 轮亮着的灯数为 3
第 14 轮亮着的灯数为 3
第 15 轮亮着的灯数为 3
第 16 轮亮着的灯数为 4
第 17 轮亮着的灯数为 4
第 18 轮亮着的灯数为 4
第 19 轮亮着的灯数为 4
第 20 轮亮着的灯数为 4
第 21 轮亮着的灯数为 4
第 22 轮亮着的灯数为 4
第 23 轮亮着的灯数为 4
第 24 轮亮着的灯数为 4

规律还是挺明显的,亮灯个数随着轮数的增加而增加。

从0轮开始:
3轮增加一个亮灯数,后面5轮增加一个,再后面 7轮增加一个亮灯数,再后面 9轮增加一个亮灯数,以此类推。
根据这个规律写程序。

完整代码

 if n == 0:
            return 0
        if n == 1:
            return 1
        res = 1
        i = 3
        j = 1
        while True:
            if  n <= i:
                return res
            j +=2
            i += j + 2
            res +=1

当然这道题的正经数学方法放到最后,但其实每次做到这种数学推论的题,并不是很简单就能想到,还是用这样旁门左道的方法比较容易解题。

正经推理:

  1. 每次某个灯被开关,是当前遍历的i为它的因子
  2. 某个灯被开关奇数次最后会亮着,偶数次最后会熄灭
  3. 某个数的因子个数为奇数个,它的所有质因子都出现了偶数次(完全平方数)
  4. 小于等于n的完全平方数个数为,1^2 … 2^2 … … sqrt(n) ^ 2, 即sqrt(n)

    在这里插入图片描述
    完整代码:
class Solution:
    def bulbSwitch(self, n: int) -> int:
        return int(sqrt(n))

标签:319,return,轮亮,res,开启,力扣,关闭,leetcode,灯数
来源: https://blog.csdn.net/qq_38737428/article/details/121387128