leetcode
leetcode 551 ~ 600
灯泡开关 Ⅱ

灯泡开关 Ⅱ

难度:

标签:

题目描述

代码结果

运行时间: 20 ms, 内存: 16.1 MB


/*
 * 思路:
 * 使用Stream API来简化条件判断和返回值的处理。
 * 由于Java Stream主要用于处理集合操作,本题使用Stream API来处理条件判断并不高效,但可以作为学习目的使用。
 */
 
import java.util.stream.Stream;
 
public class Solution {
    public int flipLights(int n, int presses) {
        return Stream.of(
            presses == 0 ? 1 : 0,
            (n == 1 && presses > 0) ? 2 : 0,
            (n == 2 && presses == 1) ? 3 : 0,
            (n == 2 && presses > 1) ? 4 : 0,
            (n > 2 && presses == 1) ? 4 : 0,
            (n > 2 && presses == 2) ? 7 : 0,
            (n > 2 && presses > 2) ? 8 : 0
        ).filter(x -> x != 0).findFirst().get();
    }
}

解释

方法:

这个题解的思路是分情况讨论。通过观察可以发现,当灯泡个数 n 大于等于 3 时,无论怎么按压开关,最多只能得到 8 种不同的状态。所以题解直接根据 n 和 presses 的不同取值,返回对应的结果。具体来说: 1. 当 presses 为 0 时,无论 n 为多少,都只有 1 种状态,即全亮。 2. 当 n 为 1 时,只有 2 种状态:全亮或全暗。 3. 当 n 为 2 时,如果只按一次开关,有 3 种状态;按多次的话,就有 4 种状态。 4. 当 n 大于等于 3 时,如果只按一次开关,有 4 种状态;按两次有 7 种状态;按更多次就有 8 种状态。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么当灯泡数量n大于等于3时,不同状态的最大数量是8种?这与开关的操作有什么关系?
当n大于等于3时,可以通过四种不同的开关操作来影响灯泡的状态:(1) 打开所有灯泡,(2) 打开奇数位的灯泡,(3) 打开偶数位的灯泡,(4) 打开3k+1位置的灯泡。由于每种操作都可能独立执行,也可以与其他操作组合执行,这些操作可以产生多种不同的灯泡状态。然而,当操作数量和灯泡数量增加时,特定的操作组合的效果可能会相互抵消或重复,因此最终可能的不同状态数是有限的。当我们仔细分析可能的操作组合时,可以找到最多8种不同的结果,这是因为操作之间的交互和特定位置的影响限制了可能的状态变化。
🦆
题解中提到,当n为2且presses大于1时,有4种状态。这4种状态是如何通过不同的按压组合得到的?
当有两盏灯且按压次数大于1时,我们可以通过不同的按压组合达到四种状态:(1) 两盏灯都亮,(2) 两盏灯都灭,(3) 第一盏灯亮、第二盏灯灭,(4) 第一盏灯灭、第二盏灯亮。这些状态可以通过以下方式实现:不按任何开关得到全亮;按下所有灯泡的开关得到全灭;只按第一次或第三次开关得到一个灯亮一个灯灭的两种情况。如果按压次数超过两次,由于操作的可逆性,这些状态会开始重复,因此总状态数不会增加。
🦆
为什么当presses为0时,不考虑n的数量,直接返回1种状态?这是否意味着所有灯泡始终保持初始状态?
当presses为0时,意味着没有任何开关被按压,因此所有灯泡都将保持其初始状态。在该题目中,默认的初始状态是所有灯泡都亮起。因此,不论灯泡数量n为多少,如果没有开关操作,最终的灯泡状态只能是全亮,即只有一种状态。
🦆
在计算不同状态数量时,题解是否考虑了开关的操作顺序会不会影响最终的灯泡状态?
在题解的分析中,考虑到开关的操作是可以逆转的,并且执行相同的操作顺序最终会导致相同的状态,因此操作的顺序并不影响最终的灯泡状态。例如,无论是先按奇数位灯泡的开关再按偶数位的开关,还是先按偶数位再按奇数位,结果都是相同的。因此,计算不同状态的数量时,只需要考虑不同操作的组合,而不是具体的操作顺序。

相关问题

灯泡开关

初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。

第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换第 i 个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。

找出并返回 n 轮后有多少个亮着的灯泡。

 

示例 1:

输入:n = 3
输出:1 
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 

你应该返回 1,因为只有一个灯泡还亮着。

示例 2:

输入:n = 0
输出:0

示例 3:

输入:n = 1
输出:1

 

提示:

  • 0 <= n <= 109