# LeetCode : 0238. Product of Array Except Self (array) ###### tags:`leetcode` ``` #include <bits/stdc++.h> #include <iostream> #include <vector> #include <unordered_map> using std::vector; using std::unordered_map; using namespace std; class BaseVectorPrint { public: void BasePrint00(vector<int>& num) { for (size_t i = 0; i < num.size(); ++i) { cout << "[" <<num.at(i) << "]" << "; "; } cout << endl; } void BasePrint01(vector<int>& num) { for (size_t i = 0; i < num.size(); ++i) { cout << num[i] << "; "; } cout << endl; } void BasePrint02(vector<int>& num) { for (const auto &item : num) { cout << item << "; "; } cout << endl; } void TwoDimensionalPrint(vector<vector<int>> &num){ for (int i = 0; i < num.size(); i++) { for (int j = 0; j < num[i].size(); j++) { cout << "[" << num[i][j] << "]"; } cout << endl; } } }; class Solution01 { public: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); vector<int> fromBegin(n); fromBegin[0]=1; vector<int> fromEnd(n); fromEnd[0]=1; for(int i=1;i<n;i++){ fromBegin[i]=fromBegin[i-1]*nums[i-1]; fromEnd[i]=fromEnd[i-1]*nums[n-i]; } //total max List {320,320,320,320,320 } //example List { 4, 5, 1, 8, 2 }; // ↑ ↘ ↑ ↘ ↑ ↘ ↑ ↘ //fromBegin List { 1, 4, 20, 20,160 } //example List { 4, 5, 1, 8, 2 }; // ↙ ↑ ↙ ↑ ↙ ↑ ↙ //fromLast List { 80, 16, 16, 2, 1 } //multiplicatiot { 80, 64,320, 40,160 } vector<int> res(n); for(int i=0;i<n;i++){ res[i]=fromBegin[i]*fromEnd[n-1-i]; } return res; } //time complexity O(n) //space complexity O(n) }; class Solution02 { public: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); int Reverse_R = 1; vector<int> ans(n); ans[0] = 1; for(int i=1;i<n;i++){ ans[i] = ans[i-1]*nums[i-1]; // make Begin List; } for(int j = (n-1); j>=0; j--){ // make End to Begin. ans[j] = ans[j]*Reverse_R; Reverse_R *= nums[j]; // Reverse_R make End List } return ans; } //time complexity O(n) //space complexity O(1) }; int main(void) { BaseVectorPrint printVector; Solution01 runfunc; vector<int> test01 = { 4, 5, 1, 8, 2 }; vector<int> test02 = { 1, 2, 3, 4 }; vector<int> test03 = { -1, 1, 0, -3, 3 }; vector<int> ans ; ans = runfunc.productExceptSelf(test01); printVector.BasePrint00(ans); //printf("%d\n",input_Nums); printf("test\n"); system("pause"); } ``` > Tip first (Begin) and last (end) is one nums > Make Begin to end List > Make End to Begin > reduce space temp space reverse total num[n-i-1]*Reverse