灯泡开关 Ⅱ
难度:
标签:
题目描述
代码结果
运行时间: 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为2且presses大于1时,有4种状态。这4种状态是如何通过不同的按压组合得到的?
▷🦆
为什么当presses为0时,不考虑n的数量,直接返回1种状态?这是否意味着所有灯泡始终保持初始状态?
▷🦆
在计算不同状态数量时,题解是否考虑了开关的操作顺序会不会影响最终的灯泡状态?
▷相关问题
灯泡开关
初始时有 n
个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。
第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i
轮,你每 i
个灯泡就切换第 i
个灯泡的开关。直到第 n
轮,你只需要切换最后一个灯泡的开关。
找出并返回 n
轮后有多少个亮着的灯泡。
示例 1:
输入:n = 3 输出:1 解释: 初始时, 灯泡状态 [关闭, 关闭, 关闭]. 第一轮后, 灯泡状态 [开启, 开启, 开启]. 第二轮后, 灯泡状态 [开启, 关闭, 开启]. 第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 你应该返回 1,因为只有一个灯泡还亮着。
示例 2:
输入:n = 0 输出:0
示例 3:
输入:n = 1 输出:1
提示:
0 <= n <= 109