1. 程式人生 > >672. 燈泡開關 Ⅱ

672. 燈泡開關 Ⅱ

現有一個房間,牆上掛有 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
說明: 狀態為: [關, 開, 關], [開, 關, 開], [關, 關, 關], [關, 開, 開].

注意: n 和 m 都屬於 [0, 1000].

==================================================

解題思路:

這個題要用遞迴就涼了,需要找一下規律

發現只要前三個燈泡確定,後面無論多少個燈泡,排列方式已經固定

也就是說,這個題輸出最多就8種

也就是總結燈泡數小於3以及運算元小於3的情況

下面是程式碼

class Solution {
    public int flipLights(int n, int m) {
        n = n<3?n:3;
        return 1<<n<(1+n*m)?1<<n:(1+n*m);
    }
}

寫一行的話就有點長了,分兩行寫吧。。。