哎这道题开始想麻烦了,一直在寻找规律。
其实没有什么规律,用一个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;
- }
- };