class Solution {
public:
vector<int> grayCode(int n) {
vector<int> res;
map<int,bool> mp;//check whether a number is existed
res.push_back(0);
if(n==0)
return res;
mp[0]=1;
vector<int> cal(n);//save as 1,2,4,8,...
cal[0]=1;
for(int i=1;i<n;i++)
cal[i]=cal[i-1]*2;
int num=0;
int i=0;
while(i<n)
{
int temp=num^cal[i];
if(mp.find(temp)==mp.end())
{
mp[temp]=1;
res.push_back(temp);
num=temp;
i=0;
}
else
i++;
}
return res;
}
};
A simpler way to do it
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> res;
res.push_back(0);
if(n==0)
return res;
int mask=1;
while(res.size()!=1<<n)
{
int len=res.size();
for(int i=len-1;i>=0;i--)
res.push_back(mask|res[i]);
mask=mask<<1;
}
return res;
}
};