672. 灯泡开关(Python)

2020-11-25  本文已影响0人  玖月晴

题目

难度:★★★☆☆
类型:数组
方法:数学

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

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

假设这 n 只灯泡被编号为 [1, 2, 3 ..., n],这 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
说明: 状态为: [关, 开, 关], [开, 关, 开], [关, 关, 关], [关, 开, 开].
注意: n 和 m 都属于 [0, 1000].

解答

这道题官方的解答已经比较的清楚了,首先,每三个灯为一个单位,所有单位的状态都是完全一样的,因此,这道题实际上只研究前三个灯就够了。

当动作执行0次:三个灯只有[1,1,1]状态,即全亮;
当执行任意动作1次:三个灯有[0,0,0], [0,1,0], [1,0,1],[0,1,1]四种可能状态;
当执行任意动作2次,三个灯有除[0,1,1]之外的所有7种可能;
当执行任意动作3次,三个灯可以取到所有8种可能。

这里注意只有两个或者一个灯也就是n<3的情况,需要特殊对待。

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]

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

上一篇下一篇

猜你喜欢

热点阅读