【经典算法题】灯泡开关

【经典算法题】灯泡开关

Leetcode 0319 灯泡开关

题目描述:Leetcode 0319 灯泡开关

在这里插入图片描述

分析

  • 本题的考点:数学

  • 一个灯泡x最后是亮的    ⟺    \iff 它被按奇数次    ⟺    \iff 它的约数个数是奇数。

  • 因此最后所有约数个数是奇数个的灯泡是亮的,比如5个灯泡被按5次,1、4灯泡就是亮的,因为1只有1这一个约数,41、2、4三个约数。

  • 下面考虑约数个数为奇数的数据有什么特点:如果一个数N可以质因数分解为 p 1 α 1 ∗ p 2 α 2 ∗ . . . ∗ p k α k p_1^{\alpha_1}*p_2^{\alpha_2}*...*p_k^{\alpha_k} p1α1p2α2...pkαk ,则N的约数个数为 ( α 1 + 1 ) ∗ ( α 2 + 1 ) ∗ . . . ∗ ( α k + 1 ) (\alpha_1+1)*(\alpha_2+1)*...*(\alpha_k+1) (α1+1)(α2+1)...(αk+1) 。则必须有 α i + 1 \alpha _ i + 1 αi+1必须是奇数,所以 α i \alpha_i αi必须是偶数,因此N是完全平方数。

  • 上面证明了如果一个数N的约数个数为奇数,则其是完全平方数。反过来也成立(例如 x = y 2 x = y^2 x=y2,只有约数y出现一次,其余都是成对出现的)。

  • 因此本题的最后答案就是1~n中完全平方数的个数。

代码

  • C++
class Solution {
public:
    int bulbSwitch(int n) {
        return sqrt(n);
    }
};
  • Java
class Solution {

    public int bulbSwitch(int n) {
        return (int) Math.sqrt(n);
    }
}

时空复杂度分析

  • 时间复杂度: O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( 1 ) O(1) O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值