leetcode Gray Code
2016-07-06 22:25
351 查看
第一次接触格雷码,同样是一脸懵逼,看了很多解释,发现其实还是很简单的,首先看一下定义:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray
Code)。
举个例子:2位格雷码:
00
01
11
10
再举个例子,3位格雷码:
000
001
011
010
110
111
101
100
是否已经发现规律了呢~反正我当时是没发现,但是现在看来非常显而易见,我们将8组数分为上下两部分,可以看到,去掉第一位,剩下的三位是完全对称的,那么题目就很简单了,我们可以根据递归,得到(n-1)位的格雷码,然后一半加前缀0,一半加前缀1,就得到了n位格雷码,代码如下:
public class Solution {
List<Integer> list=new ArrayList<>();
public List<Integer> grayCode(int n) {
if(n==0){
list.add(0);
return list;
}
List<Integer> sublist=grayCode(n-1);
int mark=1<<(n-1);
for(int i=sublist.size()-1;i>=0;i--)
{
list.add(mark+sublist.get(i));
}
return list;
}
}
Code)。
举个例子:2位格雷码:
00
01
11
10
再举个例子,3位格雷码:
000
001
011
010
110
111
101
100
是否已经发现规律了呢~反正我当时是没发现,但是现在看来非常显而易见,我们将8组数分为上下两部分,可以看到,去掉第一位,剩下的三位是完全对称的,那么题目就很简单了,我们可以根据递归,得到(n-1)位的格雷码,然后一半加前缀0,一半加前缀1,就得到了n位格雷码,代码如下:
public class Solution {
List<Integer> list=new ArrayList<>();
public List<Integer> grayCode(int n) {
if(n==0){
list.add(0);
return list;
}
List<Integer> sublist=grayCode(n-1);
int mark=1<<(n-1);
for(int i=sublist.size()-1;i>=0;i--)
{
list.add(mark+sublist.get(i));
}
return list;
}
}
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解