个人练习-Leetcode-89. Gray Code

题目链接:https://leetcode.cn/problems/gray-code/submissions/

题目大意:给出位数n,求一个合法的n位格雷码排列。

思路:低位数的格雷码是容易得出的,考虑从n-1位的格雷码得到n位格雷码。设现有 G n − 1 G_{n-1} Gn1,那么首先将其复制一份倒转过来(不是位上的数字倒转,而是这个vector的元素顺序倒转)得到 G n − 1 T G_{n-1}^T Gn1T

在这里插入图片描述
随后,给 G n − 1 T G_{n-1}^T Gn1T的每一位都填上1, G n − 1 G_{n-1} Gn1则无操作(相当于填上0)。可以看出, G n − 1 G_{n-1} Gn1 G n − 1 T G_{n-1}^T Gn1T各自内部的数字都只相差一位,而 G n − 1 T G_{n-1}^T Gn1T的首位和 G n − 1 G_{n-1} Gn1的末位,显然也只有最高位不同。因此,将它们拼接起来,得到n位格雷码 G n G_n Gn

完整代码

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> ret;
        ret.push_back(0);
        ret.push_back(1);
        for(int i = 2; i <= n; i++) {
            vector<int> cp(ret);
            for (int j = 0; j < cp.size(); j++) {
                cp[j] += 1 << (i-1);
            } 
            for (int j = cp.size()-1; j >= 0; j--)            
                ret.push_back(cp[j]);
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值