現有一個房間,牆上掛有 n 只已經打開的燈泡和 4 個按鈕。在進行了 m 次未知操做後,你須要返回這 n 只燈泡可能有多少種不一樣的狀態。 spa
假設這 n 只燈泡被編號爲 [1, 2, 3 ..., n],這 4 個按鈕的功能以下: code
示例 1: blog
輸入: n = 1, m = 1. ip
輸出: 2 io
說明: 狀態爲: [開], [關] class
示例 2: di
輸入: n = 2, m = 1. co
輸出: 3 return
說明: 狀態爲: [開, 關], [關, 開], [關, 關]
示例 3:
輸入: n = 3, m = 1.
輸出: 4
說明: 狀態爲: [關, 開, 關], [開, 關, 開], [關, 關, 關], [關, 開, 開].
注意: n 和 m 都屬於 [0, 1000].
咱們將3k+1的值定義爲內部值,非3k+1的值定義爲外部值,
容易發現,當n>=4的時候,內部值和外部值都有計數和偶數,這裏還有一個規律,就是對於一組n,m可以獲得的燈泡狀態,進行奇數次變換或者是偶數次變換以後可以變回開始的狀態,所以對於n,m2,m2>=m+2包含n,m的全部狀態
當n=1的時候,當m=1的時候包含所有兩種狀態,m=2的時候包含所有兩種狀態,m>2的時候包含m=1的時候的所有狀態,因此返回2
當n=2的時候,當m=1的時候包含3種狀態,m=2的時候包含4種狀態,m=3包含所有狀態,m>3的時候包含m=2的所有狀態也就是所有2種狀態
當n>2的時候,當m=1的時候包含7種狀態,當m=2的時候包含8種狀態,m=3的時候包含所有8種狀態,m>3的時候包含m=2的所有狀態也就是8種狀態
1 class Solution { 2 public int flipLights(int n, int m) { 3 if(m==0) return 1; 4 if(n==1) return 2; 5 if(n==2){ 6 if(m==1) return 3; 7 else{ 8 return 4; 9 } 10 } 11 if(m==1) return 4; 12 if(m==2) return 7; 13 return 8; 14 } 15 }