The basic idea is the second half of the gray code list is a mirrow copy of the first half plus the offset 2^(n-1).

By the way, Gray code is very useful in HW design (e.g. finite state machine,...)

```
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> result;
int i, pow_2, offset;
if(n>=0)
{
result.push_back(0);
for(pow_2 =0;pow_2<n;pow_2++)
{
offset = 1<<pow_2; // offset for the second half, just set the (pow_2)-th bit to 1
for(i=0;i<offset;i++)
{ // mirrow copy the first half, and plus the offset
result.push_back(result[result.size()-1 - 2*i] + offset );
}
}
}
return result;
}
};
```