【问题】给定一个数组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数组一样大小的b数组,首先计算下三角的乘积,只需要O(n)的时间可以遍历得到一个b[n]的数组,包含下三角的乘积,对角线元素值为1。然后接着对上三角进行乘积,也可以使用O(n)的时间获得其对应的值并于原来的b数组对应相乘,就可以得到答案,总复杂度为2O(n),忽略常数项即为O(n)的时间!效率非常高了!
class Solution { public: vector<int> multiply(const vector<int>& A) { int size = A.size(); vector<int> b(size); int res = 1; for(int i = 0;i < size; i++){ b[i] = res; // 计算下三角的值b[n-1] = A[0]*...*A[n-2]; res *= A[i]; } res = 1; for(int i = size-1;i >= 0; i--){ b[i] *= res; // 计算上半角b[0] = b[0]*...*A[n-1] res *= A[i]; } return b; } };