319. 灯泡开关 : 经典数论推论题

简介: 319. 灯泡开关 : 经典数论推论题

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 319. 灯泡开关 ,难度为 中等


Tag : 「数学」


初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。


第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。


i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。


找出并返回 n 轮后有多少个亮着的灯泡。


示例 1:


网络异常,图片无法展示
|


输入:n = 3
输出:1 
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 
你应该返回 1,因为只有一个灯泡还亮着。
复制代码


示例 2:


输入:n = 0
输出:0
复制代码


示例 3:


输入:n = 1
输出:1
复制代码


提示:


  • 0 <= n <= 10^90<=n<=109


数学



这是一道经典的数论题。


整理一下题意:ii 轮改变所有编号为 ii 的倍数的灯泡的状态(其中灯泡编号从 11 开始)。


一个编号为 xx 的灯泡经过 nn 轮后处于打开状态的充要条件为「该灯泡被切换状态次数为奇数次」。


同时,一个灯泡切换状态的次数为其约数的个数(去重)。


于是问题转换为:[1,n][1,n] 内有多少个数,其约数的个数为奇数。这些约数个数为奇数的灯泡就是最后亮着的灯泡。


又根据「约数」的定义,我们知道如果某个数 kkxx 的约数,那么 \frac{x}{k}kx 亦为 xx 的约数,即「约数」总是成对出现,那么某个数的约数个数为奇数,意味着某个约数在分解过程中出现了 22 次,且必然重复出现在同一次拆解中,即 k = \frac{x}{k}k=kx,即有 xx 为完全平方数(反之亦然)。


问题最终转换为:[1,n][1,n] 中完全平方数的个数为多少。


根据数论推论,[1,n][1,n] 中完全平方数的个数为 \left \lfloor \sqrt{n} \right \rfloorn,即最后亮着的灯泡数量为 \left \lfloor \sqrt{n} \right \rfloorn


代码:


class Solution {
    public int bulbSwitch(int n) {
        return (int)Math.sqrt(n);
    }
}
复制代码


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


最后



这是我们「刷穿 LeetCode」系列文章的第 No.319 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
7月前
|
容器
如何在射击游戏中实现双摇杆控制?
如何在射击游戏中实现双摇杆控制?
82 0
|
传感器 Linux Python
一起玩转树莓派(19)——红外遥控控制实验
红外遥控是生活中非常常见的电子器具,电视机,空调,音响等电器都可以通过遥控器进行控制。本篇博客,我们尝试来通过红外发生器和红外信号接受器来进行红外控制实验,在树莓派上通过红外遥控的按键来处理LED灯的控制。
2026 0
|
算法
319. 灯泡开关【我亦无他唯手熟尔】
319. 灯泡开关【我亦无他唯手熟尔】
72 0
|
IDE 开发工具 C语言
【史上最全面esp32教程】蜂鸣器篇(是噪声还是音乐?)
【史上最全面esp32教程】蜂鸣器篇(是噪声还是音乐?)
875 0
|
Python
Leetcode|灯泡开关
Leetcode|灯泡开关
79 0
|
容器
射击游戏中如何实现双摇杆控制
嗨!大家好,我是小蚂蚁。 在移动设备上玩射击游戏,双摇杆控制是一种比较好的方式,我们今天就来分享一下如何在射击游戏中实现双摇杆控制。 所谓的双摇杆控制,指的是一个摇杆控制角色的移动,一个摇杆控制角色的射击。 来到小游戏制作工具中,先导入一些素材。
210 0
摇杆控制移动自动瞄准射击如何实现?
前言 这篇教程实现了射击游戏中的摇杆控制移动以及自动瞄准射击功能,并提供一个示例项目的模版。
138 0
LeetCode 1375. 灯泡开关 III
LeetCode 1375. 灯泡开关 III
|
芯片
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项
743 0
单片机:蜂鸣器发声和自动关闭一站式教程:(附赠如何控制声音大小和音调)软件编程+硬件原理+注意事项