Skip to content

Commit c4d1e2f

Browse files
committed
✨feat: add 672
1 parent 71eb228 commit c4d1e2f

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

Index/脑筋急转弯.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
| [419. 甲板上的战舰](https://leetcode-cn.com/problems/battleships-in-a-board/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/battleships-in-a-board/solution/gong-shui-san-xie-ji-chong-sao-miao-xian-trmc/) | 中等 | 🤩🤩🤩🤩 |
66
| [423. 从英文中重建数字](https://leetcode-cn.com/problems/reconstruct-original-digits-from-english/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/reconstruct-original-digits-from-english/solution/gong-shui-san-xie-nao-jin-ji-zhuan-wan-m-vg7a/) | 中等 | 🤩🤩🤩🤩 |
77
| [667. 优美的排列 II](https://leetcode.cn/problems/beautiful-arrangement-ii/) | [LeetCode 题解链接](https://leetcode.cn/problems/beautiful-arrangement-ii/solution/by-ac_oier-lyns/) | 中等 | 🤩🤩🤩🤩 |
8+
| [672. 灯泡开关 Ⅱ](https://leetcode.cn/problems/bulb-switcher-ii/) | [LeetCode 题解链接](https://leetcode.cn/problems/bulb-switcher-ii/solution/by-ac_oier-3ttx/) | 中等 | 🤩🤩🤩🤩🤩 |
89
| [908. 最小差值 I](https://leetcode.cn/problems/smallest-range-i/) | [LeetCode 题解链接](https://leetcode.cn/problems/smallest-range-i/solution/by-ac_oier-7fh0/) | 简单 | 🤩🤩🤩🤩 |
910
| [2038. 如果相邻两个颜色均相同则删除当前颜色](https://leetcode-cn.com/problems/remove-colored-pieces-if-both-neighbors-are-the-same-color/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/remove-colored-pieces-if-both-neighbors-are-the-same-color/solution/gong-shui-san-xie-nao-jin-ji-zhuan-wan-y-a8xm/) | 中等 | 🤩🤩🤩🤩🤩 |
1011
| [2069. 模拟行走机器人 II](https://leetcode-cn.com/problems/walking-robot-simulation-ii/) | [LeetCode 题解链接](https://leetcode-cn.com/problems/walking-robot-simulation-ii/solution/by-ac_oier-6zib/) | 中等 | 🤩🤩🤩🤩 |
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
### 题目描述
2+
3+
这是 LeetCode 上的 **[672. 灯泡开关 Ⅱ](https://leetcode.cn/problems/bulb-switcher-ii/solution/by-ac_oier-3ttx/)** ,难度为 **中等**
4+
5+
Tag : 「脑筋急转弯」
6+
7+
8+
9+
房间中有 `n` 只已经打开的灯泡,编号从 `1``n` 。墙上挂着 `4` 个开关 。
10+
11+
`4` 个开关各自都具有不同的功能,其中:
12+
13+
* 开关 1 :反转当前所有灯的状态(即开变为关,关变为开)
14+
* 开关 2 :反转编号为偶数的灯的状态(即 `2, 4, ...`
15+
* 开关 3 :反转编号为奇数的灯的状态(即 `1, 3, ...`
16+
* 开关 4 :反转编号为 `j = 3k + 1` 的灯的状态,其中 `k = 0, 1, 2, ...`(即 `1, 4, 7, 10, ...`
17+
18+
你必须 恰好 按压开关 `presses` 次。每次按压,你都需要从 `4` 个开关中选出一个来执行按压操作。
19+
20+
给你两个整数 `n``presses`,执行完所有按压之后,返回 不同可能状态 的数量。
21+
22+
示例 1:
23+
```
24+
输入:n = 1, presses = 1
25+
26+
输出:2
27+
28+
解释:状态可以是:
29+
- 按压开关 1 ,[关]
30+
- 按压开关 2 ,[开]
31+
```
32+
示例 2:
33+
```
34+
输入:n = 2, presses = 1
35+
36+
输出:3
37+
38+
解释:状态可以是:
39+
- 按压开关 1 ,[关, 关]
40+
- 按压开关 2 ,[开, 关]
41+
- 按压开关 3 ,[关, 开]
42+
```
43+
示例 3:
44+
```
45+
输入:n = 3, presses = 1
46+
47+
输出:4
48+
49+
解释:状态可以是:
50+
- 按压开关 1 ,[关, 关, 关]
51+
- 按压开关 2 ,[关, 开, 关]
52+
- 按压开关 3 ,[开, 关, 开]
53+
- 按压开关 4 ,[关, 开, 开]
54+
```
55+
56+
提示:
57+
* $1 <= n <= 1000$
58+
* $0 <= presses <= 1000$
59+
60+
---
61+
62+
### 分情况讨论
63+
64+
记灯泡数量为 $n$(至少为 $1$),翻转次数为 $k$(至少为 $0$),使用 `1` 代表灯亮,使用 `0` 代表灯灭。
65+
66+
我们根据 $n$ 和 $k$ 的数值分情况讨论:
67+
68+
* 当 $k = 0$ 时,无论 $n$ 为何值,都只有起始(全 `1`)一种状态;
69+
* 当 $k > 0$ 时,根据 $n$ 进一步分情况讨论:
70+
* 当 $n = 1$ 时,若 $k$ 为满足「$k > 0$」的最小值 $1$ 时,能够取满「`1`/`0`」两种情况,而其余更大 $k$ 值情况能够使用操作无效化(不影响灯的状态);
71+
* 当 $n = 2$ 时,若 $k = 1$,能够取得「`11`/`10`/`01`」三种状态,当 $k = 2$ 时,能够取满「`11`/`10`/`01`/`00`」四种状态,其余更大 $k$ 可以通过前 $k - 1$ 步归结到任一状态,再通过最后一次的操作 $1$ 归结到任意状态;
72+
* 当 $n = 3$ 时,若 $k = 1$ 时,对应 $4$ 种操作可取得 $4$ 种方案;当 $k = 2$ 时,可取得 $7$ 种状态;而当 $k = 3$ 时可取满 $2^3 = 8$ 种状态,更大的 $k$ 值可通过同样的方式归结到取满的 $8$ 种状态。
73+
* 当 $n > 3$ 时,根据四类操作可知,灯泡每 $6$ 组一循环(对应序列 `k + 1``2k + 2``2k + 1``3k + 1`),即只需考虑 $n <= 6$ 的情况,而 $n = 4$、$n = 5$ 和 $n = 6$ 时,后引入的灯泡状态均不会产生新的组合(即新引入的灯泡状态由前三个灯泡的状态所唯一确定),因此均可归纳到 $n = 3$ 的情况。
74+
75+
Java 代码:
76+
```Java
77+
class Solution {
78+
public int flipLights(int n, int k) {
79+
if (k == 0) return 1;
80+
if (n == 1) return 2;
81+
else if (n == 2) return k == 1 ? 3 : 4;
82+
else return k == 1 ? 4 : k == 2 ? 7 : 8;
83+
}
84+
}
85+
```
86+
TypeScript 代码:
87+
```TypeScript
88+
function flipLights(n: number, k: number): number {
89+
if (k == 0) return 1
90+
if (n == 1) return 2
91+
else if (n == 2) return k == 1 ? 3 : 4;
92+
else return k == 1 ? 4 : k == 2 ? 7 : 8;
93+
};
94+
```
95+
* 时间复杂度:$O(1)$
96+
* 空间复杂度:$O(1)$
97+
98+
---
99+
100+
### 最后
101+
102+
这是我们「刷穿 LeetCode」系列文章的第 `No.672` 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
103+
104+
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
105+
106+
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode
107+
108+
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
109+

0 commit comments

Comments
 (0)