返回

细读题意,一览319.灯泡开关的正解思路

前端

细读题意,直达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. 灯泡开关 题目的正确解法,并能帮助你解决其他类似的问题。