# 89. Gray Code

## 1.問題&#x20;

![](https://901207480-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGKoChvN9am4__HCIRK%2F-LNcivxVEXEeloBWtcTW%2F-LNd3b8eRqudq5JyIvEG%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-09-30%20%E4%B8%8B%E5%8D%882.02.17.png?alt=media\&token=c2d5c46a-a8bb-44aa-98bd-1593c1edbfba)

![](https://901207480-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGKoChvN9am4__HCIRK%2F-LNcivxVEXEeloBWtcTW%2F-LNd3f2Z9qDZ9f7GRs9T%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202018-09-30%20%E4%B8%8B%E5%8D%882.02.25.png?alt=media\&token=7267ef61-a286-4e01-9c42-03de579e486c)

## 2.想法 <a href="#id-2-xiang-fa" id="id-2-xiang-fa"></a>

* 提問
  * 確認題意:  相鄰的element只會差異一個bit, 因此如果DFS的方式順序不對
* function header, parameter
* test input
* 說明想法
  * 每次double容器中的元素, 因此n回後, 容器的元素數目為2 ^ n
  * 每回合會反向改變固定bit的值 &#x20;
* 測試計算複雜度

## **3.程式碼** <a href="#id-3-cheng-shi" id="id-3-cheng-shi"></a>

```
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> res;
        //2的次方為1, n=0時, res也會有一個element
        res.push_back(0);
        
        //每次讓res中elememt的元素double
        for (int i = 0; i < n; i++) {
            int size = res.size();
            //同一回合中, 對每個res中的element都只改變同一個bit
            for (int j = size - 1; j >= 0; j--) {
                res.push_back(res[j] | 1 << i);
            }
        }
        
        return res;
    }
};
```
