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

說明: 狀態爲: [開, 關], [關, 開], [關, 關]

解決方案

這道題看着挺難,但不能按照題中的要求直接暴力的思考。題中重點就是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>3m=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 團隊


   

微信號:算法與編程之美          

長按識別二維碼關注我們!

溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章