class Solution:
    def grayCode(self, n: int) -> List[int]:
        """ O(2^N)/O(1)
        main idea: initialized number is all 0s with length of size n. change from lower digit to higher digit, start 
        """
        
        res = [0]
        for i in range(n):
            for j in range(len(res)-1,-1,-1):  # since there are one bit differ from last change, so we need to reverse iterate the results we have so far 
                res.append(res[j] | 1 << i) # update higer digit by set higher digit as 1 
                # res.append(res[j] + (1 << i))
        
        return res