This is very straight forward.

You can use the knowledge which you learned in topology class.

Draw a dot which is 0-D where N is 0, name the dot as number {0}

Draw a line which is 1-D where N is 1, name the dot as numbers {0, 1}

Draw a rectangle which is 2-D where N is 2, name the dot as numbers {00, 01, 11, 10}

Draw a cube which is 3-D where N is 3, name the dot as numbers {000, 001, 011, 010, 110, 111, 101, 100}

Draw a 4-D hypercube where N is 4 ... (2 3-D cubes)

Draw a 5-D hypercube... (4 3-D cubes)

6-D... Ok... it's hard to draw 8 cubes in 6-D.... now we can find a pattern here.

See? there is a pattern.

```
vector<int> grayCode(int n) {
if(n == 0) return {0};
vector<int> ret = {0, 1};
for(int i=2; i<=n; i++)
for(int j=ret.size()-1; j>=0; j--)
ret.push_back(ret[j]+(1<<i-1));
return ret;
}
```