time : O(n) space: O(n);