leetcode 319. 灯泡开关 python

题目描述:

 

 

 题解一:模拟整个过程(超时)

1.初始化代表n个灯泡,第一轮之后全部初始化为1

2.第二轮每两个将一个从1变为0

3.模拟第i轮,将第i个灯泡状态反转

class Solution(object):
    def bulbSwitch(self, n):
        if n==0:
            return 0
        if n==1:
            return 1
        lights = [1 for i in range(n)]
        for i in range(n):
            if (i+1)%2==0:
                lights[i]=0
        for i in range(3,n+1):
            for j in range(n):
                if (j+1)%i==0:
                    if lights[j]==0:
                        lights[j]=1
                    else:
                        lights[j]=0
        return sum(lights)

 

题解二:参考【LeetCode】319. Bulb Switcher 解题报告(Python)_负雪明烛-CSDN博客

思路:

1.第i个灯泡,开关拨动次数为偶数,最终状态为灭,拨动次数为奇数,最终状态为亮。

2.第i个灯泡,被拨动的次数和i的因数数量相等。

n=3为例:

i=1 因数只有1

i=2 因数有1 2 在第一第二轮被拨动,最终灭

i=3 因数有1 3 在第一第三轮被拨动,最终灭

i的因数可以写作i=a*b情况,通常情况下成对出现,只有a=b的情况,即平方,才会出现因数数量为奇数。

因此题目可以转换为:求n内有多少个平方数。

class Solution(object):
    def bulbSwitch(self, n):
        return int(math.sqrt(n))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值