现有一个房间,墙上挂有 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 }