# 238. Product of Array Except Self

&#x20;[**238. Product of Array Except Self**](https://leetcode.com/problems/product-of-array-except-self/description/)

Given an array `nums` of *n* integers where *n* > 1,  return an array `output` such that `output[i]` is equal to the product of all the elements of `nums` except `nums[i]`.

**Example:**

```
Input:  [1,2,3,4]
Output: [24,12,8,6]
```

**Note:** Please solve it **without division** and in O(*n*).

**Follow up:**\
Could you solve it with constant space complexity? (The output array **does not** count as extra space for the purpose of space complexity analysis.)

***My Solutions:***

对于某一个数字，如果知道其前面所有数字的乘积，同时也知道后面所有的数乘积，那么二者相乘就是要的结果。所以分别创建出这两个数组，分别从数组的两个方向遍历就可以分别创建出乘积累积数组。      &#x20;

再进行空间上的优化: 由于最终的结果都是要乘到结果res中，所以我们可以不用单独的数组来保存乘积，而是直接累积到res中：

* 先从左到右遍历一遍，将乘积的结果存入res中。在res里把第一个数记做1。res里其他的数是nums里的数所有左边数的乘积。比如【1,2,3,4】的res会是【1,1,2,6】
* 然后从右到左开始遍历，用一个临时变量right，初始化为1，当做右边所有数的乘积。每次移动先更新res里的数为最终结果res\[i] = res\[i] \* right，然后更新right: right = right \* nums\[i]。比如res=【1,1,2,6】
  * res=【1,1,2,6】，right=4
  * res=【1,1,8,6】，right=4\*3=12
  * res=【1,12,8,6】, right=12\*2=24
  * res=【24,12,8,6】

```
class Solution {
    public int[] productExceptSelf(int[] nums) {
 
        int[] res = new int[nums.length];
        res[0] = 1;
        
        //save the the left product for nums[i] at res[i]
        for (int i = 1; i < nums.length; i++) {
            res[i] = res[i - 1] * nums[i - 1];
        }
        
        // save the final result in res[i] as res[i] * right; update right to be right * nums[i]
        int right = 1;
        for (int i = nums.length - 1; i >= 0; i--) {
            res[i] *= right;
            right *= nums[i];
        }
        
        return res;
    }
}
```
