解题思路
以示例1为例 创建两个数组dp(统计该位置之的所有乘积) bp(统计该位置之后的所有乘积)
比如 1 2 3 4 3的dp应该等于 1*2 bp应该等于 4 这样 dp* bp就为该位置的答案
分别计算出每个位置前后的乘积然后放入数组 然后相乘放入
但要注意两个边界 最前和最后 dp[0] =1 bp[nums.size()-1] =1
那么第 i 个位置的dp如何求呢? dp[i]=dp[i-1] * nums[i-1] 从前向后遍历
那么第 i 个位置的bp如何求呢? bp[i]=dp[i+1] * nums[i+1] 从后向前遍历
然后创建ret数组 每个位置遍历一遍 ret[i] = dp[i] * bp[i]
代码如下
class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n=nums.size();vector<int> dp (n),bp(n),ret(n);dp[0]=1,bp[n-1]=1;for(int i=1;i<n;i++){dp[i]=dp[i-1]*nums[i-1];}for(int i=n-2;i>=0;i--){bp[i]=bp[i+1]*nums[i+1];}for(int i=0;i<n;i++){ret[i]=dp[i]*bp[i];}return ret;}
};