码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode--Gray Code

时间:2015-05-18 09:12:13      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

The gray code is a binary numeral system where two successive values differ in only one bit.

Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.

For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:

00 - 0
01 - 1
11 - 3
10 - 2

Note:
For a given n, a gray code sequence is not uniquely defined.

For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.

解题思路

将格雷码的二进制表示成十进制。格雷码特征是每两个相邻的码字只有一个比特位是不同的,其余的均相同,这种特征使得格雷码是对称的(镜像特征),就是说又上往下排列的码字,从中间对折,高位相反,低位完全相同。eg
00 
01 
11 
10 

下面我们给出两种算法,第一种就是利用这种对称特征,较为复杂,第二种,利用对称和移位,在之前已经构造的格雷码的基础上,由下往上遍历已经建好的格雷码(假设码有i位),依次增加((1<<i)),并加入到格雷码序列中。相当于设置二进制序列的第i位为1.两种算法的代码如下:

方法一:

vector<int> grayCode(int n) {
	if(n==0)
	{
		vector<int> res(1,0);
		return res;
	}
	if(n==1)
	{
		vector<int> res(2,0);
		res[1]=1;
		return res;
	}
	vector<int>  mem(n,0);
	vector<vector<int>>  mem2;
	mem2.push_back(mem);
	mem[0]=1;
	mem2.push_back(mem);
	mem[1]=1;
	mem2.push_back(mem);
	mem[0]=0;
	mem2.push_back(mem);
	int lll=(1<<n);
	int flag=1;
	for (int i=4;i<lll;)
	{
		int len=mem2.size()-1;
		flag++;
		for (int j=len;j>=0;j--)
		{
			vector<int> temp=mem2[j];
			i++;
			temp[flag]=1;
			mem2.push_back(temp);
			if (i>=lll)
			{
				break;
			}
		}
	}
	mem.clear();
	for (int i=0;i<mem2.size();i++)
	{
		int temp=0;
		for (int j=0;j<n;j++)
		{
			temp+=mem2[i][j]*pow(2.0,j);
		}

		mem.push_back(temp);
	}
	return mem;
}


方法二

vector<int> grayCode1(int n)
{
	vector<int> res(1,0);
	for (int i=0;i<n;i++)
	{
		int cur=res.size();
		while(cur)
		{
			cur--;
			int num=res[cur];
			num+=(1<<i);
			res.push_back(num);
		}
	}
	return res;
}


leetcode--Gray Code

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/45793171

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!