672. 灯泡开关(Python)
题目
难度:★★★☆☆
类型:数组
方法:数学
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
现有一个房间,墙上挂有 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解决方案,请移步力扣中等题解析