89. 格雷编码
思路:位运算,找规律。观察数字对应的二进制形式,我们会发现在2n个数里面(即,0~2n-1),前2(n-1)个数与后2(n-1)个数都有对应的数,恰好一位不同,说白了后面的2(n-1)个数比前面的2(n-1)个数,在二进制里面最前面多了个1,找到这个规律就好办了。我们只需要从后遍历前“2^(n-1)个已经排好顺序的数”,然后往后插入对应的一位不同的数v[j]+(1<<(i-1))
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> v;
v.push_back(0);
int i=1;
while(i<=n){
for(int j=(1<<(i-1))-1;j>=0;j--){//从后遍历前“2^(n-1)个已经排好顺序的数”
v.push_back(v[j]+(1<<(i-1)));//插入对应的一位不同的数
}
i++;
}
return v;
}
};