# 【LeetCode】 238. 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].
> Constraint: It's guaranteed that the product of the elements of any prefix or suffix of the array (including the whole array) fits in a 32 bit integer.
> 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.)
> 給予有n個整數的陣列nums且n > 1,回傳一個陣列output且output[i]等於nums所有元素的乘積除了nums[i]。
> 制約:保證乘積一定在32位元的表示範圍之內。
> 注意:請不使用除法並且在O(n)的時間複雜度之下完成此題。
> 進階:
你可以在常數等級的空間複雜度完成這題嗎?(output陣列並不算在額外空間之中。)
## Example:
```
Example:
Input: [1,2,3,4]
Output: [24,12,8,6]
```
## Solution
* 如果沒有除法的限制,這題就很簡單:
* 先算出所有元素的乘積,然後跑一次for將元素除回去即可。
* 但這樣這題就不會是中等難度了XD
* 不使用除法的情況之下,我們可以先想想,不乘上自己的話,就是`自己前面的乘積` * `自己後面的乘積`。
* 因此我們就跑兩次for,分別得到前面和後面的乘積,最後再一個for相乘即可得到答案。
* 時間複雜度`O(3n) = O(n)`。
---
* 挑戰的部分怎麼做呢?其實很簡單,仔細觀察後就會發現,`back`和`front`其實只需要其中一個,另一個的運算可以直接跟原本的`nums`結合就好。
* 在下方範例中保留`back`。
* 詳細的部分就請直接看下方code自己trace了。
### Code
* 一般
```C++=1
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> front(nums.size(), 1), back(nums.size(), 1);
for(int i = 1; i < nums.size(); i++)
back[i] = back[i - 1] * nums[i - 1];
for(int i = nums.size() - 2; i >= 0; i--)
front[i] = front[i + 1] * nums[i + 1];
for(int i = 0; i < nums.size(); i++)
nums[i] = front[i] * back[i];
return nums;
}
};
```
* 挑戰
```C++=1
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> back(nums.size(), 1);
for(int i = 1; i < nums.size(); i++)
back[i] = back[i - 1] * nums[i - 1];
int temp = 1;
nums.push_back(1);
for(int i = back.size() - 1; i >= 0; i--)
{
temp *= nums[i + 1];
back[i] *= temp;
}
return back;
}
};
```
###### tags: `LeetCode` `C++`