Brute Force with O(N) space

class Solution:
    def buildArray(self, nums: List[int]) -> List[int]:
        """tc O(N)  sc O(N)
        """
        n = len(nums)
        A = [None]*n
        for i,x in enumerate(nums):
            A[i] = nums[x]
        return A
            

O(1) inplace optimization

class Solution:
    def buildArray(self, A: List[int]) -> List[int]:
        """tc O(N)  sc O(1)
        main idea: Euclidean division   a = q*b + r where r is original A[i],  b:  encoded r  => A[A[j]] at pos i 
        """
        q = len(A)
        for i in range(q):
            r = A[i]
            b = A[A[i]]%q # retrieve already encoded r by using mod q 
            A[i] = q*b +r
        for i in range(q):
            A[i] = A[i]//q # get b since r < q =>  a = qb + r =>  a//q = qb//b + r//q  => b 
        return A