歡迎點擊「算法與編程之美」↑關注我們!
本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
歡迎加入團隊圈子!與作者面對面!直接點擊!
問題描述
現有一個房間,牆上掛有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
說明: 狀態爲: [開, 關], [關, 開], [關, 關]
解決方案
這道題看着挺難,但不能按照題中的要求直接暴力的思考。題中重點就是4個按鈕的功能,所以首先根據4種按鈕的功能可以發現,所有功能執行2次與不執行效果相同,因此可以將所有功能執行情況分爲執行0次與執行1次。其次,按鈕執行的前後順序變換對最終燈泡情況沒有影響。
首先觀察開關次數對開關方式變化:
m=0時,情況不變,只有1種狀態
m=1時,根據示例思考一下可以知道,當n>=3時狀態恆爲4
m=2時,數字1-4代表按鈕的4種功能,0代表返回原狀態:
1+1=0 1+2=3 1+3=2 1+4=?5?
2+2=0 2+3=1 2+4=?6?
3+3=0 3+4=?7?
4+4=0
共7種情況。
m=3時,這時可以認爲在m=2情況下再次進行一步,由於順序可調換,顯然m=3的情況相比m=2的情況又多了一種,因此爲8種。
m>3時,由於前3個燈可以確定後面其餘部分,因此最多狀態爲8中。也就是可以把m>3和m=3歸爲一類。
再分析n對狀態的影響:
實際上,前3個燈唯一地確定了序列的其餘部分,因此n>3的情況與n=3的情況相同。
再將n=2以及n=1的情況列舉一下,
最後把m和n對狀態的影響結合起來。
題目代碼:
class Solution: def flipLights(self, n: int, m: int) -> int: if m == 0: return 1 if n == 1: return 2 elif n == 2: if m == 1: return 3 return 4 elif n >= 3: if m == 1: return 4 elif m == 2: return 7 return 8 |
結語
這道題看着感覺很難,似乎最後有很多種狀態,特別是隨着燈泡數量n的增大,最後狀態數量可能很多。但仔細觀察題中給出的4種按鈕功能,每一次改變都是某些部分一起改變,並不會出現一大堆燈泡裏面只有一個燈泡發生改變。所以只要仔細觀察,確定規律就很好解決。
END
主 編 | 王文星
責 編 | 周茂林
where2go 團隊
微信號:算法與編程之美
長按識別二維碼關注我們!
溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!