剑指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[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;
}

 

posted @ 2018-05-07 21:01  汕大小吴  阅读(778)  评论(0编辑  收藏  举报