友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

672. 灯泡开关 Ⅱ

房间中有 n 只已经打开的灯泡,编号从 1n 。墙上挂着 4 个开关

这 4 个开关各自都具有不同的功能,其中:

  • 开关 1 :反转当前所有灯的状态(即开变为关,关变为开)

  • 开关 2 :反转编号为偶数的灯的状态(即 0, 2, 4, …​

  • 开关 3 :反转编号为奇数的灯的状态(即 1, 3, …​

  • 开关 4 :反转编号为 j = 3k + 1 的灯的状态,其中 k = 0, 1, 2, …​(即 1, 4, 7, 10, …​

你必须 恰好 按压开关 presses 次。每次按压,你都需要从 4 个开关中选出一个来执行按压操作。

给你两个整数 npresses ,执行完所有按压之后,返回 不同可能状态 的数量。

示例 1:

输入:n = 1, presses = 1
输出:2
解释:状态可以是:
- 按压开关 1 ,[关]
- 按压开关 2 ,[开]

示例 2:

输入:n = 2, presses = 1
输出:3
解释:状态可以是:
- 按压开关 1 ,[关, 关]
- 按压开关 2 ,[开, 关]
- 按压开关 3 ,[关, 开]

示例 3:

输入:n = 3, presses = 1
输出:4
解释:状态可以是:
- 按压开关 1 ,[关, 关, 关]
- 按压开关 2 ,[关, 开, 关]
- 按压开关 3 ,[开, 关, 开]
- 按压开关 4 ,[关, 开, 开]

提示:

  • 1 <= n <= 1000

  • 0 <= presses <= 1000

思路分析

数学题。通过分析找规律。

常规解法是深度优先比遍历或广度优先遍历。

0672 10
0672 11
0672 12
  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-05-02 21:42:55
 */
public int flipLights(int n, int presses) {
  // 不按开关
  if (presses == 0) {
    return 1;
  }
  //特殊情况处理
  if (n == 1) {
    return 2;
  } else if (n == 2) {
    //特殊情况
    return presses == 1 ? 3 : 4;
  } else {
    //n >= 3
    return presses == 1 ? 4 : presses == 2 ? 7 : 8;
  }
}