灯泡开关问题:数学规律与平方数解法


🌺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. 代码解释

  1. 数学解法

    • 直接返回n的平方根的整数部分
    • 例如:n=3,√3≈1.732,取整为1
    • n=9,√9=3,结果为3
  2. 为什么有效

    • 1~n中的完全平方数有⌊√n⌋个
    • 只有这些位置的灯泡会被切换奇数次,最终亮着

5. 复杂度分析

  • 时间复杂度:O(1),仅需一次平方根计算
  • 空间复杂度:O(1),不需要额外空间

6. 验证示例

验证n=3:

  • 完全平方数:1(共1个)
  • 结果:1(与示例一致)

验证n=9:

  • 完全平方数:1,4,9(共3个)
  • 结果:3

7. 总结

本题看似复杂,实则可以通过数学规律简化为求平方根的问题。关键在于发现:

  1. 灯泡最终状态取决于被切换次数的奇偶性
  2. 只有完全平方数有奇数个约数
  3. 因此亮着的灯泡数就是⌊√n⌋

这种数学解法高效优雅,避免了模拟n轮操作的O(n²)复杂度,能够轻松处理n=10^9的大规模数据。

在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值