zoukankan      html  css  js  c++  java
  • 微软面试题: LeetCode 89. 格雷编码 middle 出现次数:2

    题目描述:

    89. 格雷编码 难度 中等

    动态规划:

    按照动态规划或者说递归的思路去想,也就是解决了小问题,怎么解决大问题。

    我们假设我们有了 n = 2 的解,然后考虑怎么得到 n = 3 的解。

    n = 2 的解

    00 - 0

    10 - 2

    11 - 3

    01 - 1

    如果再增加一位,无非是在最高位增加 0 或者 1,考虑先增加 0。

    n = 3 的解,最高位是 0

    000 - 0

    010 - 2

    011 - 3

    001 - 1

    由于加的是 0,其实数值并没有变化,依然符合格雷编码的规则。

    再考虑增加 1,在 n = 2 的解基础上在最高位把 1 丢过去?

      n = 3 的解,在n = 2 的解 最高位加 0 得到

    000 - 0
    010 - 2
    011 - 3
    001 - 1

    n = 3 的解,在n = 2  的解最高位加 1 得到 --------新增
    100 - 4
    110 - 6
    111 - 7
    101 - 5

    第 4 行 001 和新增的第 5 行 100,有 3 个 bit 位不同了,不符合格雷编码规则。

    可以在加 0 之后 ,改变一下 加 1 的顺序,第五行 将第四行的最高位从 0 变成 1,

    其余不变,第六行 将第 3行的最高位从 0 变为 1,其余不变。依次类推。

    现在成功根据 n = 2 的解 推出 n = 3 的解了,问题解决。

     1 class Solution {
     2 public:
     3     vector<int> grayCode(int n)
     4     {
     5           vector<int> res;
     6           res.push_back(0);
     7           if(n == 0) return res;
     8           res.push_back(1);
     9           if(n == 1) return res;
    10           for(int i = 2;i <= n;++i)
    11           {
    12               int tmp_len = res.size();
    13               for(int j = tmp_len - 1; j >= 0; --j)
    14               {
    15                   int add = 1 << i-1;//用移位操作更快
    16                   // int add = power(2,i-1);
    17                   res.push_back(res[j] + add);
    18               }
    19           }
    20           return res;
    21     }
    22 };
  • 相关阅读:
    iOS 字典转模型 KVC 实现
    iOS开发 滤镜的使用
    iOS开发 二维码生成
    iOS开发 iOS10兼容访问http
    Jmockit 使用小计 1.46
    springboot样例 pom与小花招
    react + antd html网页配置非框架
    Vue 设置 vue router 路径错误检查
    java 8 读取配置文件例子
    mysql 项目配置
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/14093368.html
Copyright © 2011-2022 走看看