【剑指offer】51:构建乘积数组
题目描述:
给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
解题思路:
该题目可以直接进行暴力求解,每一次进行求解B数组中的每一项时,都把A数组中的n - 1个数据进行相乘,很显然此时的时间复杂度为O(n^2)。
function multiply(array) { // write code here if (array.length <= 1) { return 0; } let arrayB = []; for (let i = 0; i < array.length; i++) { let temp = 1; for (let j = 0; j < array.length; j++) { if (i == j) { continue }else { temp *= array[j]; } } arrayB.push(temp); } return arrayB; }
不难发现,这种暴力解法进行了大量的重复计算,为了避免重复计算降低时间复杂度,我们分别进行计算,将分为i之前和i之后两部分进行。用两个for循环便可以实现,可以看出,此时时间复杂度降为O(n)
代码实现:
JS
function multiply(array) { // write code here var arrayB = []; if (array.length <= 1) { return 0; } arrayB[0] = 1; //分为两部分进行计算 //第一部分计算i之前的 for (var i = 0; i < array.length; i++) { arrayB[i] = array[i - 1] * array[i - 1]; } var temp = 1; //第二部分计算i之前的 for (var j = array.length; j >= 0 ; j--) { var temp = array[j + 1] * temp; arrayB[j] = arrayB[j] * temp; } return arrayB; }

浙公网安备 33010602011771号