LeetCode/格雷编码

n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:

  • 每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1)
  • 第一个整数是 0
  • 一个整数在序列中出现 不超过一次
  • 每对 相邻 整数的二进制表示 恰好一位不同 ,且
  • 第一个 和 最后一个 整数的二进制表示 恰好一位不同

给你一个整数 n ,返回任一有效的 n 位格雷码序列

1.回溯法(超时)

回溯法
class Solution {
public:
    //应该是异或运算结果是2的n次幂
    unordered_set<int> map_;
    bool cut = false;
    vector<int> grayCode(int n) {
        for(int i=0;i<n;i++) map_.insert(pow(2,i));
        int num = pow(2,n);
        vector<bool> flag(num,false);
        vector<int> Code;
        backtrack(Code,0,flag,num);
        return Code;
    }
    void backtrack(vector<int>&list,int index,vector<bool>flag,int num){

        if(index==num){cut=true;return;}
        for(int i=0;i<num;i++){
            if(index==0||(!flag[i]&&map_.count(i^list[index-1]))){
                if(index==num-1&&!map_.count(i^list[0])) continue;
            list.push_back(i);
            flag[i]=true;
            backtrack(list,index+1,flag,num);
            if(cut) break;
            list.pop_back();
            flag[i]=false;
            }
        }
    }
};

2.格雷码公式

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ret(1 << n);
        for (int i = 0; i < ret.size(); i++) {
            ret[i] = (i >> 1) ^ i;
        }
        return ret;
    }
};

3.镜像反转

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ret;
        ret.reserve(1 << n);
        ret.push_back(0);
        for (int i = 1; i <= n; i++) {
            int m = ret.size();
            for (int j = m - 1; j >= 0; j--) {
                ret.push_back(ret[j] | (1 << (i - 1)));
            }
        }
        return ret;
    }
};
posted @   失控D大白兔  阅读(28)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示