672.バルブスイッチⅡ
難易度:中
既存の部屋、壁は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]に属しています。
解決
4つのボタンの効果の分析:
ボタン1:単一の電球を1 つのグループと見なすことができます(各グループは同じ動作を繰り返します)
ボタン2:2つの電球
ごとボタン3:2つの電球
ごとボタン4:3つごと球根のグループ
6個の球根ごとに1つの単位と見なすことができ、後ろの6個の球根のグループごとに前を繰り返すため、球根のnが6より大きい場合、後ろは無視できます。さらに簡略化できます。3つの電球ごとに1つの単位と見なされ、最初の6つの電球には1〜6の番号が付けられます。電球1と4、3、5、2、6は同じ状態です。
同時に、ボタンを偶数回押すと、 、キーストローク数m> = 4の場合、最大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]