题目描述
给定一个数组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]。不能使用除法。
题目分析
这道题有两种解法,第二种是在第一种的基础上优化了下。
第一种解法:B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]=C[i-1]*D[i-1],也就是我们要求出 C[i] 和 D[i] 就行,相当于牺牲空间复杂度来换时间复杂度。
第二种解法:第一种解法我们发现需要额外的数组,这明显其实本来是没有必要的,因为B数组的计算就是来自于A,不需要多余的C和D数组,那么有什么更好的办法吗?
我们可以可以直接利用B数组并且借助中间变量tmp来实现,具体看代码。
代码
第一种解法:
// 第一种 function multiply(array) { const C = [], D = [], n = array.length; C[0] = array[0]; for (let i = 1; i < n; i++) { C[i] = array[i] * C[i - 1]; } D[n - 1] = array[n - 1]; for (let i = n - 2; i >= 0; i--) { D[i] = array[i] * D[i + 1]; } const B = []; B[0] = D[1]; B[n - 1] = C[n - 2]; for (let i = 1; i < n - 1; i++) { B[i] = C[i - 1] * D[i + 1]; } return B; }
第二种方法:
// 第二种 function multiply2(array) { const B = [], len = array.length; B[0] = 1; // 计算前i - 1个元素的乘积 for (let i = 1; i < len; i++) { B[i] = array[i - 1] * B[i - 1]; } let tmp = 1; // 计算后N - i个元素的乘积并连接 for (let i = len - 2; i >= 0; i--) { tmp *= array[i + 1]; B[i] *= tmp; } return B; }