|
🌺The Begin🌺点点关注,收藏不迷路🌺
|
1. 题目描述
初始时有 n 个关闭的灯泡。进行 n 轮操作:
- 第1轮:打开所有灯泡
- 第2轮:每2个灯泡切换第2个灯泡的状态
- …
- 第i轮:每i个灯泡切换第i个灯泡的状态
- 第n轮:切换最后一个灯泡的状态
最终返回有多少个灯泡是亮着的。
示例1:
输入:n = 3
输出:1
解释:
初始状态:[关, 关, 关]
第1轮后:[开, 开, 开]
第2轮后:[开, 关, 开]
第3轮后:[开, 关, 关]
只有第1个灯泡亮着
示例2:
输入:n = 0
输出:0
示例3:
输入:n = 1
输出:1
2. 解题思路
2.1 问题分析
每个灯泡最终的状态取决于它被切换了多少次:
- 初始状态:关闭(需要奇数次切换才能最终亮着)
- 第i个灯泡会在其约数的轮次被切换
- 因此,灯泡i最终亮着当且仅当i有奇数个约数
2.2 关键发现
数学知识:
- 完全平方数有奇数个约数
- 非完全平方数有偶数个约数
因此,亮着的灯泡数量就是1~n中完全平方数的个数,也就是⌊√n⌋。
3. 代码实现
int bulbSwitch(int n) {
// 亮着的灯泡数量就是1~n中完全平方数的个数
// 即对n开平方后取整数部分
return sqrt(n);
}
4. 代码解释
-
数学解法:
- 直接返回
n的平方根的整数部分 - 例如:n=3,√3≈1.732,取整为1
- n=9,√9=3,结果为3
- 直接返回
-
为什么有效:
- 1~n中的完全平方数有⌊√n⌋个
- 只有这些位置的灯泡会被切换奇数次,最终亮着
5. 复杂度分析
- 时间复杂度:O(1),仅需一次平方根计算
- 空间复杂度:O(1),不需要额外空间
6. 验证示例
验证n=3:
- 完全平方数:1(共1个)
- 结果:1(与示例一致)
验证n=9:
- 完全平方数:1,4,9(共3个)
- 结果:3
7. 总结
本题看似复杂,实则可以通过数学规律简化为求平方根的问题。关键在于发现:
- 灯泡最终状态取决于被切换次数的奇偶性
- 只有完全平方数有奇数个约数
- 因此亮着的灯泡数就是⌊√n⌋
这种数学解法高效优雅,避免了模拟n轮操作的O(n²)复杂度,能够轻松处理n=10^9的大规模数据。

|
🌺The End🌺点点关注,收藏不迷路🌺
|

5501

被折叠的 条评论
为什么被折叠?



