update solution 3

This commit is contained in:
ShusenTang 2020-06-24 20:19:06 +08:00 committed by GitHub
parent b01ab44ea0
commit 9d31289601
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -21,9 +21,9 @@ Int Grey Code Binary
参考维基百科及[这篇博客](http://www.omegaxyz.com/2017/11/16/grayandbi/)可很容易地写出代码。 参考维基百科及[这篇博客](http://www.omegaxyz.com/2017/11/16/grayandbi/)可很容易地写出代码。
## 思路三(最快) ## 思路三(最快)
参考[维基百科](https://zh.wikipedia.org/wiki/%E6%A0%BC%E9%9B%B7%E7%A0%81#%E9%8F%A1%E5%B0%84%E6%8E%92%E5%88%97)我们知道格雷码是按照镜面排列的n位元的格雷码可以从n-1位元的格雷码以上下镜射后加上新位元的方式快速的得到如下图所示。 参考[维基百科](https://zh.wikipedia.org/wiki/%E6%A0%BC%E9%9B%B7%E7%A0%81#%E9%8F%A1%E5%B0%84%E6%8E%92%E5%88%97)我们知道,**格雷码是按照镜面排列的**n位元的格雷码可以从n-1位元的格雷码以上下镜射后加上新位元的方式快速的得到如下图所示。
![graycode](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Binary-reflected_Gray_code_construction.svg/250px-Binary-reflected_Gray_code_construction.svg.png) ![graycode](http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Binary-reflected_Gray_code_construction.svg/250px-Binary-reflected_Gray_code_construction.svg.png)
这样就可以用迭代的方式产生格雷码。 可以在前面加上新位元如上图绿色所示这样就和思路二产生的一样了也可以在后面添加新位元也是满足要求的相邻两个编码只有一个bit不同
@ -76,15 +76,19 @@ public:
class Solution { class Solution {
public: public:
vector<int> grayCode(int n) { vector<int> grayCode(int n) {
vector<int>res; vector<int>res{0};
res.push_back(0); for(int b = 0; b < n; b++){
for(int i = 0; i < n; i++){ for(int i = res.size() - 1; i >= 0; i--) // 镜面复制
int size = res.size(); res.push_back(res[i]);
for(int j = 0; j < size; j++)
res.push_back(res[size - j - 1]); int half_size = res.size() >> 1;
for(int j = 0; j < res.size(); j++){ for(int i = 0; i < half_size; i++){
res[j] = res[j] | ((j / size) << i); // 在左边添加一半的0和一半的1 // 在前面添加新位元
// res[j] = (res[j] << 1) | (j / size); // 在右边添加一半的0和一半的1 res[i + half_size] += (1 << b);
// 在后面添加新位元
// res[i] <<= 1;
// res[i + half_size] = (res[i + half_size] << 1) + 1;
} }
} }
return res; return res;