leetcode672. 灯泡开关 Ⅱ——减小搜索空间(规律题)

672. 灯泡开关 Ⅱ

Difficulty: 中等

现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮。在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态。

假设这 n 只灯泡被编号为 [1, 2, 3 …, n],这 4 个按钮的功能如下:

  1. 将所有灯泡的状态反转(即开变为关,关变为开)
  2. 将编号为偶数的灯泡的状态反转
  3. 将编号为奇数的灯泡的状态反转
  4. 将编号为 3k+1 的灯泡的状态反转(k = 0, 1, 2, …)

示例 1:

输入: n = 1, m = 1.
输出: 2
说明: 状态为: [开], [关]

示例 2:

输入: n = 2, m = 1.
输出: 3
说明: 状态为: [开, 关], [关, 开], [关, 关]

示例 3:

输入: n = 3, m = 1.
输出: 4
说明: 状态为: [关, 开, 关], [开, 关, 开], [关, 关, 关], [关, 开, 开].

注意: nm 都属于 [0, 1000].

Solution

分析
四个按钮的效果:
按钮1:单个灯泡可以看作一组(每组都重复同样的行为)
按钮2:每两个灯泡一组
按钮3:每两个灯泡一组
按钮4:每三个灯泡一组
易知每六个灯泡可以看成一个单元,后边每六个一组都是重复前面的,因此灯泡n多于6时,后边可以不用考虑。可以进一步化简,每三个灯泡看作一个单元,给前六个灯泡编号1-6,则灯泡1与4、3与5、2与6分别状态相同
同时,按钮如果按偶数次等于没按,当按键次数m>=4时,最多四个按钮都起作用。
因此,n的规模缩小为[0, 6],m的规模缩小为[0, 4]
(其实n>=3、m>=3时,都是8种情况)

在缩小了搜索空间的前题下,列举所有情况

class Solution(object):
    def flipLights(self, n, m):
        n = min(n, 3)
        if m == 0: return 1
        if m == 1: return [2, 3, 4][n-1]
        if m == 2: return [2, 4, 7][n-1]
        return [2, 4, 8][n-1]

猜你喜欢

转载自blog.csdn.net/qq_45268474/article/details/108503166