leetcode-Gray Code-89
输入n,求n个bit的格雷码,格雷码是从0开始,每个数之间只有一个bit不一样,如00,01,11,10
这题先审错了题,以为求n个bit的数有多少种,相当于选择,用dfs+回溯,没有注意到格雷码的要求。
找规律:根据要求发现可以这么做:
每轮以2^k为一组来求,假设上一轮的2^(k-1)是合法的格雷码,那么这一轮就在上一轮的(k-1)个bit前面加一个bit,且这个最高位的bit=1,
要使这k个bit满足格雷码,因为上一轮的(k-1)的所有组合都已知并且是合法的格雷码,所以我只要依次在上一轮的(k-1)个bit前加1即可,不懂画图,具体看代码
1 class Solution { 2 public: 3 vector<int> grayCode(int n){ 4 vector<int> v; 5 v.push_back(0); 6 if(n==0) return v; 7 v.push_back(1); 8 for(int i=2;i<=n;i++){ 9 int j=pow(2,i-1); 10 int len=v.size()-1; 11 for(int k=0;k<j;k++){ 12 v.push_back(v[len-k]+j); 13 } 14 } 15 return v; 16 } 17 };