哎这道题开始想麻烦了,一直在寻找规律。
其实没有什么规律,用一个set保存已有序列,cur对应当前序列。
对cur从低位到高位依次判断改变位值后是否为新的序列,如是则加入set,并更新cur。
如已存在则继续判定更高位。如果所有位的改变都不能产生新的序列,则结束。
我只能说这是个"笨方法"了,在没有更好的方法之前。
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> res;
unordered_set<int> s;
s.insert(0);
res.push_back(0);
if(n==0)
return res;
int cur = 0;
for(int i=1;i<=n;++i){
if(s.find(cur^(1<<(i-1))) == s.end()){
cur ^= (1<<(i-1));
res.push_back(cur);
s.insert(cur);
i=0;
}
}
return res;
}
};
果然是种笨方法。
参考维基百科的GrayCode解释,其中有如下规律。
第i个序列为i^(i>>1)。
项具体了解内涵可访问 http://en.wikipedia.org/wiki/Gray_code
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> res;
unsigned int size = 1<<n;
for(int i=0;i<size;++i)
res.push_back(i^(i>>1));
return res;
}
};