吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1494|回复: 2
收起左侧

[Python 转载] leetcode89.格雷编码题解

  [复制链接]
ksqqorz 发表于 2021-11-20 16:47
思路:
格雷码在通信和IC数据跨时钟域经常使用,其将0-2^n的数据按照每两个数只变化一个bit位的顺序排列。

本题考查如何生成一个格雷排列(n不超过16)。

这里是类似递归的一种处理,如果使用暴力处理,需要极大的空间和试错。
我们考虑从n为i的格雷码生成i+1的格雷码的方法


这里从i到i+1会增加一倍的数,我们这里0 -- 2^i-1的生成已经完成,这里最高位一直是0,
即 0{xxxx0} -> 0{xxxxx}。
这里从2^i -- 2^(i+1)-1的数据要根据前面的数据生成,最高位必须为1,而且第一个数据已经确定为第2^i-1个数据将最高bit为调为1得到。
0{00000} (第0个) -> 0{xxxxx}(第2^i -1个)-> 1{xxxx}  (第2^i个)。
这里我们按照第0->(2^i -1)的bit位变化方法,不过由于不是从0开始,所以需要考虑如何从0转换到1{xxxx};这里考虑到这里0->1的bit翻转方式,我们可以知道异或的操作对于该方式是(兼容)的,即将0->(2^i -1)均异或上1{xxxx}这个数据,那么即可以完成后面2^i个数据的生成。

这里我们即可以根据n来递归实现。
python实现:
[Python] 纯文本查看 复制代码
class Solution:
    def grayCode(self, n: int) -> List[int]:
        if n>1:
            M = self.grayCode(n-1)[-1]+(1<<(n-1))
            return self.grayCode(n-1) + [(a^M) for a in self.grayCode(n-1)]
        else:
            return [0,1] 



代码写的快,跑起来结果当然比较慢:
无标题.png
尾记:
思路应该OK,要提速就要从list的生成出发,这里list反复调用加减是很费时的操作,直接拉一个list,在里面操作数据肯定会加速很多。
这里懒得折腾了。。。

免费评分

参与人数 2吾爱币 +1 热心值 +1 收起 理由
tewboo + 1 我很赞同!
unnamedmemory + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

阳光肥肥 发表于 2021-11-20 18:58
其实提速也没太麻烦
直接在函数头上加一句@cache就行了 就是把之前结果缓存一下
耗时36ms击败百分之93.....
[Python] 纯文本查看 复制代码
class Solution:
    @cache
    def grayCode(self, n: int) -> List[int]:
        if n>1:
            M = self.grayCode(n-1)[-1]+(1<<(n-1))
            return self.grayCode(n-1) + [(a^M) for a in self.grayCode(n-1)]
        else:
            return [0,1]

不过这个题还是建议看题解区第一个,k神的题解
 楼主| ksqqorz 发表于 2021-11-24 22:41
阳光肥肥 发表于 2021-11-20 18:58
其实提速也没太麻烦
直接在函数头上加一句@cache就行了 就是把之前结果缓存一下
耗时36ms击败百分之93... ...

确实,尽可能减少计算以及计算复杂度,复用现有数据,以及这个cache。学到了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表