标签:319 return 轮亮 res 开启 力扣 关闭 leetcode 灯数
题目在这: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
当然这道题的正经数学方法放到最后,但其实每次做到这种数学推论的题,并不是很简单就能想到,还是用这样旁门左道的方法比较容易解题。
正经推理:
- 每次某个灯被开关,是当前遍历的i为它的因子
- 某个灯被开关奇数次最后会亮着,偶数次最后会熄灭
- 某个数的因子个数为奇数个,它的所有质因子都出现了偶数次(完全平方数)
- 小于等于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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。