力扣319(java)-灯泡开关(中等)
题目:
初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。
第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换第 i 个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。
找出并返回 n 轮后有多少个亮着的灯泡。
输入:n = 3
输出:1
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:1
提示:
0 <= n <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bulb-switcher
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
n个灯泡要执行n轮灯泡状态的变换
1.灯泡什么时候才是 [亮] 的状态?----变换的次数为奇数次。
2.什么情况会改变第 i 个灯泡的开关?--- 当轮数k是 i 的约数时才会改变第 i 个灯泡的状态。
例如:
i = 4,只有第1,2,4会切换第4个灯泡的状态,所以最后第4个灯泡的状态是开,因为它做了奇数次的变换;
i = 8,只有1,2,4,8会切换第8个灯泡的状态,所以最后第8个灯泡的状态是关,因为它做了偶数次的变换。
因此就可以发现像4,9,16...这种完全平方数的约数就为奇数个(9 = 1x9=3x3,对于约数3来说,出现了两次所以忽略一次,故把9的约数看成3个,而不是4个),从而该题就可以转变为求:小于等于n的数中完全平方数的个数,即完全平方的个数为⌊√n⌋(⌊n⌋ 表示向下取整)最后灯泡亮着的个数为⌊√n⌋。
代码:
1 class Solution { 2 public int bulbSwitch(int n) { 3 return (int) Math.sqrt(n); 4 } 5 }