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 };

 

posted @ 2016-08-31 10:42  0_summer  阅读(135)  评论(0编辑  收藏  举报