LeetCode: 89 Gray Code — Bit formula i XOR i>>1

公式ビット式 G(i) = i XOR (i>>1) により、隣接が1ビット差の巡回列を O(2^n) で生成します。

アルゴリズム概要

入力 n に対し長さ 2^n の Gray Code を生成します。隣接要素(末尾と先頭を含む)が常に1ビットだけ異なる巡回列です。
最短かつ実装容易な方法は、整数 i に対し G(i) = i XOR (i>>1) を適用し、i=0..2^n-1 を一括生成する手法です。

ステップバイステップ解説

  1. 1
    サイズ m を計算

    m = 1 << n を計算し、結果リストの長さを決めます。

  2. 2
    i を 0 から m-1 まで反復

    range を用いて i を順に処理します。

  3. 3
    Gray 値を計算

    code = i XOR(i を 1 ビット右シフト)を計算します。

  4. 4
    結果に追加し完了

    code を結果リストに追加し、全 i が終われば完成です。

Play は 1 回のみ再生。最後に自動的に Step 1 に戻ります。

可視化(SVG)

m = 1 << n を計算 結果リストを用意

各ステップの処理内容を日本語で表示しています。長い文は改行し、矩形サイズと viewBox を拡大してはみ出しを防止しています。

コード例(Python / LeetCode形式)

クラス形式・pylance適合の型注釈付き。行番号とコピーに対応しています。

from __future__ import annotations
from typing import List

class Solution:
    """
    Gray Code generator
    LeetCode提出想定 (Python 3.11+, pylance対応)
    """

    def grayCode(self, n: int) -> List[int]:
        """
        Args:
            n (int): bit length (1 <= n <= 16)

        Returns:
            List[int]: Gray code sequence starting from 0

        Complexity:
            Time: O(2^n)
            Space: O(2^n)
        """
        m: int = 1 << n
        # 内包表記で高速構築。各 i に対し i ^ (i >> 1) を計算。
        result: List[int] = [(i ^ (i >> 1)) for i in range(m)]
        return result

視覚的図解・フローチャート(SVG)

開始 m = 1 << n を計算 i を 0 から m-1 までループ code = i XOR (i を 1 ビット右シフト) 結果に追加 完了

開始 → サイズ計算 → ループ → Gray 値計算 → 追加 → 完了の流れを日本語で示しています。長い文は改行し、矩形と viewBox を拡大してはみ出しを防止しています。

Start → size 計算 → ループ → Gray 値計算 → 追加 → 完了の流れを示します。

計算量

  • Time: O(2^n)
  • Space: O(2^n)(出力リスト)。追加領域は O(1)。