解法1
class Solution {
void DFS(int c,int n,vector<int> &ans,vector<int> &vec,vector<bool> &v){
v[c]=true;
for(int i=0;i<n;++i){
if((c&vec[i])==0&&c+vec[i]<vec[n]&&!v[c+vec[i]]){
ans.push_back(c+vec[i]);
DFS(c+vec[i],n,ans,vec,v);
}
if((c&vec[i])!=0&&c-vec[i]>0&&!v[c-vec[i]]){
ans.push_back(c-vec[i]);
DFS(c-vec[i],n,ans,vec,v);
}
}
}
public:
vector<int> grayCode(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<int> ans,vec;
vec.push_back(1);
for(int i=1;i<=n;++i){
vec.push_back(vec[i-1]*2);
}
vector<bool> v(vec[n]+1,false);
v[0]=true;
ans.push_back(0);
DFS(0,n,ans,vec,v);
return ans;
}
};
解法2
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ret;
int count = 0x01 << n;
for(int i = 0 ; i < count; ++i) {
ret.push_back(i ^ (i>>1));
}
return ret;
}
};