思路:如上图构建一个矩阵,可以看到B[i]即为矩阵的第i行所有元素的乘积。
定义C[i] = A[0] * A[1] *........*A[I-1], D[I] = A[I +1] * A[I + 2] *.......A[n-2]*A[n-1](拆分项,将大问题分解为小问题)
(现在问题就是求C[i] 和 D[i] 了, 发现子问题还可以被分解,子问题存在递推的关系)
可得C[i] = C[i-1]* A[i-1] D[I] = D[I + 1] * A[I + 1] 而B[i] = C[i] * D[i]
class Solution {
public:
vector<int> multiply(const vector<int>& A)
{
vector<int>res;
int len = A.size();
if(len == 0)
return res;
int * C = new int[len + 1];
int * D = new int[len + 1];
//初始化C[i]
C[0] = 1;
C[1] = A[0];
for(int i = 2; i < len; i++)//求C[i]
C[i] = C[i - 1] * A[i - 1];
//同上C[i];
D[len - 1] = 1;
D[len - 2] = A[len - 1];
for(int i = len - 3; i >= 0; i--)
{
D[i] = D[i + 1] * A[i + 1];
}
for(int i = 0; i < len ; i++)
{
res.push_back (C[i] * D[i]);
}
delete []C;
delete []D;
return res;
}
};
JAVA版本:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int n = A.length;
int []res = new int[n];
if(n <= 0)
return res;
int []C = new int[n + 1];
int []D = new int[n + 1];
C[0] = 1;
C[1] = A[0];
for(int i = 2; i < n; i++)
C[i] = C[i - 1] * A[i - 1];
D[n - 1] = 1;
for(int i = n - 2; i >= 0; i--) {
D[i] = D[i + 1] * A[i + 1];
}
for(int i = 0; i < n; i++)
res[i] = C[i] * D[i];
return res;
}
}