细读题意,一览319.灯泡开关的正解思路
2024-02-07 17:04:13
细读题意,直达319.灯泡开关的正解思路
Leetcode 319.灯泡开关 这道题目给定了一个包含n盏灯泡的环形灯带,这些灯泡初始都是关闭的。你可以在任一时刻翻转灯泡的状态,也就是说,开着的灯会关掉,关着的灯会打开。当灯泡状态稳定(即,没有任何灯泡的状态发生变化)时,有多少盏灯是开着的?
乍看之下,你会考虑使用两重循环模拟题中的过程,但是,这会导致超时。为了找到正确的解法,我们需要仔细审题。题中给出了一个提示:“当灯泡状态稳定时,有多少盏灯是开着的?”。这就表明,灯泡的状态最终会达到稳定状态,而且此时灯泡的状态只与灯泡的总数n有关。
基于这个提示,我们可以使用数学的方法来解决这个问题。我们首先要确定灯泡的状态如何随时间变化。假设我们从第一盏灯开始翻转灯泡的状态,那么第一盏灯的状态会变成开,第二盏灯的状态会变成关,第三盏灯的状态会变成开,以此类推。翻转完第一盏灯后,灯泡的状态会变成:开-关-开-关-开-......。
继续翻转第二盏灯,那么第二盏灯的状态会变成开,第四盏灯的状态会变成关,第六盏灯的状态会变成开,以此类推。翻转完第二盏灯后,灯泡的状态会变成:开-开-关-开-关-开-......。
以此类推,翻转第三盏灯,灯泡的状态会变成:开-开-开-关-开-关-开-......。
我们可以发现,当我们翻转第k盏灯时,所有第k的倍数的灯泡的状态都会发生变化。因此,当灯泡状态稳定时,开着的灯泡一定是那些所有因子都是奇数的灯泡。
比如,对于n=10的情况,满足上述条件的灯泡是:1, 4, 9,所以开着的灯泡总数为3。
综上所述,我们可以使用数学方法来解决这道题,时间复杂度为O(n^0.5),其中n是灯泡的总数。以下是以 Python、Java、C++ 等语言实现的代码示例:
def bulbs(n):
return int(n ** 0.5)
print(bulbs(10))
public int bulbs(int n) {
return (int)Math.sqrt(n);
}
public static void main(String[] args) {
System.out.println(bulbs(10));
}
int bulbs(int n) {
return sqrt(n);
}
int main() {
cout << bulbs(10) << endl;
return 0;
}
希望本文能帮助你理解 319. 灯泡开关 题目的正确解法,并能帮助你解决其他类似的问题。