zoukankan      html  css  js  c++  java
  • LeetCode OJ--Gray Code **

    http://oj.leetcode.com/problems/gray-code/ 

    求格雷码的表示,主要应用递归。

    递归生成码表

    这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
    1. 1位格雷码有两个码字
    2. (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
    3. (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
      #include <iostream>
      #include <vector>
      #include <Cmath>
      using namespace std;
      
      class Solution {
      public:
          vector<vector<int> > ans;
      
          vector<int> generateGrayCode(int i,int j,int num_bits)
          {
              vector<int> ansTemp;
              if(j == 0 && i == 0)
              {
                  ansTemp.push_back(0);
                  return ansTemp;
              }
              else if(j == 0 && i == 1)
              {
                  ansTemp.push_back(1);
                  return ansTemp;
              }
              
              if(i< pow(2,(double)num_bits))
              {
                  ansTemp = generateGrayCode(i,j-1,num_bits-1); //顺序
                  ansTemp.push_back(0);
              }
              else
              {
                  ansTemp = generateGrayCode( 2*pow(2,(double)num_bits) - i -1 ,j-1,num_bits-1); //逆序
                  ansTemp.push_back(1);
              }
              
              return ansTemp;
          }
          
          vector<int> grayCode(int n) {
              vector<int> answerInt;
              answerInt.clear();
              if(n == 0)
              {
                  answerInt.push_back(0);
                  return answerInt;
              }
              ans.clear();
              vector<int> onePiece;
              for(int i = 0;i< pow(2,(double)n);i++)
              {
                  onePiece = generateGrayCode(i,n-1,n-1);
                  ans.push_back(onePiece);
              }
              int i_ans = 0;
              
              for(int i = 0;i< pow(2,(double)n) ;i++)
              {
                  onePiece = ans[i];
                  //转换成整数
                  i_ans = 0;
                  for(int mm = n-1;mm>=0;mm--)
                  {
                      i_ans *=2;
                      i_ans += onePiece[mm];
                  }
                  answerInt.push_back(i_ans);
              }
              return answerInt;
          }
      };
      
      int main()
      {
          Solution myS;
          myS.grayCode(0);
          return 0;
      }
  • 相关阅读:
    基于Html5的移动应用开发经验总结:第一篇架构选型篇(下)
    401 Palindromes 解题报告
    uva 537 Artificial Intelligence?
    根据所给的年月,打印该月份的日历表
    八皇后问题
    uva10815 Andy's First Dictionary
    憋了我半天,写个博客发泄一下
    uva 457
    uva 10010 Where's Waldorf?
    uva424 Integer Inquiry
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3528176.html
Copyright © 2011-2022 走看看