http://oj.leetcode.com/problems/gray-code/
求格雷码的表示,主要应用递归。
递归生成码表
这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
-
1位格雷码有两个码字
-
(n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
-
(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; }