备忘录迭代:避免递归过程大量重复计算,改用空间存放小问题计算结果
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],
其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。
即去除A[i]的所有元素相乘 ,不能使用除法
思路:通过动态规划 构建前后2部分的乘积备忘录数组,而后相乘即可
(注意一开始存入基础乘数 1 以及访问的下标调整 )
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
//可以将最终结果划分为前后2部分相乘
vector<int> first;
vector<int> last;
first.push_back(1);
last.push_back(1);
int length=A.size();
for(int i=0;i<length;i++)
{
first.push_back(A[i]*first.back());//每次取A[i] *B[i-1]放入B
last.push_back(A[length-i-1]*last.back());
}
vector<int> B;
for(int i=0;i<length;i++)
{
int res=first[i]*last[length-1-i];
B.push_back(res);
}
return B;
}
};
其中 vector中的back()方法获取当前数组最后一个元素