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 原题链接和其他优选题解。

相关文章
|
8月前
|
Go Android开发
圆曾经的小车梦,造一台智能小车(三)之小车前进后退左右转基本框架
圆曾经的小车梦,造一台智能小车(三)之小车前进后退左右转基本框架
215 0
|
7月前
|
前端开发 芯片
【芯片前端】保持代码手感——不重叠序列检测
【芯片前端】保持代码手感——不重叠序列检测
|
11月前
|
Python
Python|找规律解决灯泡开关Ⅱ
Python|找规律解决灯泡开关Ⅱ
61 0
|
12月前
|
算法 C++ Python
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
|
12月前
|
算法 C++
每日算法系列【LeetCode 319】灯泡开关
每日算法系列【LeetCode 319】灯泡开关
|
传感器 机器学习/深度学习 算法
【动态规划】基于A星算法实现机器人动态避障附matlab代码
【动态规划】基于A星算法实现机器人动态避障附matlab代码
|
存储 算法
407. 接雨水 II : 经典 Dijkstra 运用题
407. 接雨水 II : 经典 Dijkstra 运用题
【数字IC手撕代码】Verilog边沿检测电路(上升沿,下降沿,双边沿)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog边沿检测电路(上升沿,下降沿,双边沿)|题目|原理|设计|仿真
【数字IC手撕代码】Verilog边沿检测电路(上升沿,下降沿,双边沿)|题目|原理|设计|仿真
|
机器学习/深度学习
LeetCode每日一题——672. 灯泡开关 Ⅱ
房间中有 n 只已经打开的灯泡,编号从 1 到 n 。墙上挂着 4 个开关 。
70 0
|
算法 安全 C++
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移
221 0
科学家小蓝来到了一个荒岛,准备对这个荒岛进行探测考察。 小蓝使用了一个超声定位设备来对自己进行定位。为了使用这个设备,小蓝需要在不同的点分别安装一个固定的发射器和一个固定的接收器。小蓝手中还有一个移