【经典算法题】灯泡开关
Leetcode 0319 灯泡开关
题目描述:Leetcode 0319 灯泡开关
分析
-
本题的考点:数学。
-
一个灯泡
x
最后是亮的 ⟺ \iff ⟺它被按奇数次 ⟺ \iff ⟺它的约数个数是奇数。 -
因此最后所有约数个数是奇数个的灯泡是亮的,比如
5
个灯泡被按5
次,1、4
灯泡就是亮的,因为1
只有1
这一个约数,4
有1、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α1∗p2α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)。