题目大意:输入一个数字n,输出一个整数序列,是n位二进制,每个相邻的数字只有一位二进制位的不同。
这道题看过网上的其他的一些解法,什么移位之后再做异或,感觉这种方法实在是太trick了,我根据一些提示用的递归的方法来做
首先观察n=2的输出:00,01,11,10
接着观察n=3的输出:000,001,011,010,110,111,101,100
n=3的输出,前四个元素是最高位为0,不看最高位,后两位是n=2的输出,后四个元素最高位为1,不看最高位,后两位是n=2的反向输出。所以求n=3的输出,首先就要递归求n=2的输出。递归到n=1结束,为0,1。
求解程序:
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> tmp;
vector<int> ret;
if(n==1){
ret.push_back(0);
ret.push_back(1);
return ret;
}else if(n==0){
ret.push_back(0);
return ret;
}
tmp=grayCode(n-1);
for(int i=0;i<(int)tmp.size();++i){
ret.push_back(tmp[i]);
}
for(int i=(int)tmp.size()-1;i>=0;--i){
ret.push_back((1<<(n-1))+tmp[i]);
}
return ret;
}
};
时间上讲依然打败了90%以上的人。只不过这种求解耗费存储空间比较大,每次递归求解都要生成一个vector。