第一眼看到就是枚举,回溯法。

n位的ans就是在n-1的ans的基础上,每一个在首位加上1。

但是有个难点,要保证相邻两数之间只有一位在变化,怎么办?

首先

00

00  01

00  01  11  10

本来是傻乎乎的,直接加的,没有保证只变化1位。

后来发现,从00到01是只变了1位,那么我们给01加上2呢?就变成11, 给00加上2就变成 10。

每次逆序加2^n-1,这样就保证了相邻只变一位。

说不清,基本是蒙对的。碰上了。上代码吧。

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ans;
        
        ans.push_back(0);
        for(int i=0;i<n;i++)
        {
            int len = ans.size();
            for(int j = len-1; j >=0; j--)
            {
                ans.push_back(ans[j] + pow(2,i));
            }
        }
        return ans;
    }
};

 

posted on 2017-12-11 09:30  newbird2017  阅读(146)  评论(0编辑  收藏  举报