题目描述
思路解析动画文字版
核心:切换次数 = 约数个数;只有完全平方数的约数个数是奇数,所以最后亮的就是平方数位置,共 ⌊√n⌋ 盏。
开始之前:9 盏灯全部是关着的,格子里写 0 表示灭、1 表示亮。
第 1 轮,要切换的是 1 的倍数:第 1、2、3、4、5、6、7、8、9 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 1、2、3、4、5、6、7、8、9 盏灯各自亮灭互换了一次,现在亮着 9 盏。
第 2 轮,要切换的是 2 的倍数:第 2、4、6、8 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 2、4、6、8 盏灯各自亮灭互换了一次,现在亮着 5 盏。
第 3 轮,要切换的是 3 的倍数:第 3、6、9 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 3、6、9 盏灯各自亮灭互换了一次,现在亮着 4 盏。
第 4 轮,要切换的是 4 的倍数:第 4、8 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 4、8 盏灯各自亮灭互换了一次,现在亮着 6 盏。
第 5 轮,要切换的是 5 的倍数:第 5 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 5 盏灯各自亮灭互换了一次,现在亮着 5 盏。
第 6 轮,要切换的是 6 的倍数:第 6 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 6 盏灯各自亮灭互换了一次,现在亮着 4 盏。
第 7 轮,要切换的是 7 的倍数:第 7 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 7 盏灯各自亮灭互换了一次,现在亮着 3 盏。
第 8 轮,要切换的是 8 的倍数:第 8 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 8 盏灯各自亮灭互换了一次,现在亮着 2 盏。
第 9 轮,要切换的是 9 的倍数:第 9 盏灯(绿色标出)。切换就是亮↔灭翻一下。
翻转后:第 9 盏灯各自亮灭互换了一次,现在亮着 3 盏。
9 轮结束,最后亮的是第 1、4、9 盏,恰好是 1²、2²、3²。它们的约数个数是奇数,所以被切了奇数次还亮着,共 3 盏 = ⌊√9⌋。
三个高频追问:切换次数=约数个数、平方数约数为奇、以及大 n 下为何必须用 O(1) 公式。
参考代码
import mathdef bulbSwitch(n): # 最后亮着的灯 = 1..n 里完全平方数的个数 return int(math.isqrt(n))复杂度
- 时间:O(1),直接对 n 开平方取整,不用真的模拟每一轮
- 空间:O(1),只返回一个整数,不开任何数组
易错点
面试追问把动画讲成自己的话
追问为什么切换次数等于约数个数?
追问为什么只有完全平方数的约数个数是奇数?
追问n 很大(如 10^9)还能这么做吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
检测正方形
LeetCode 2013 · 中等 · 沿着 数学套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题