剑指 Offer 66. 构建乘积数组

126 阅读1分钟

剑指 Offer 66. 构建乘积数组

解题思路

可能常规的思路是,我先把总的乘积算出来,然后用一个数组存当前索引左边的乘积,再次遍历的时候用总的乘积除左边的乘积就ok了,但是这样,如果数组中任何一个元素是0,所有结果就完了

思路:

  1. 从左到右遍历构建当前元素之前的的左边的所有乘积

image.png 2. 从右向左遍历,用一个变量来存当前元素右边元素的所有乘积 3. 当前结果集中任何一个元素 = 其左边所有元素的乘积 * 其右边所有元素的乘积

var constructArr = function (a) {
  let n = a.length;
  // 非空判定
  if (!n) return [];
  // 结果集中任何一个元素 = 其左边所有元素的乘积 * 其右边所有元素的乘积
  let result = new Array(n).fill(1);
  let rightAccu = 1;
  for (let i = 1; i < n; i++) {
    // 构建左边的乘积并保存在结果集中
    result[i] = result[i - 1] * a[i - 1];
  }
  for (let i = n - 2; i >= 0; i--) {
    // 构建右边乘积,以a = [1, 2, 3, 4, 5]举例,这里的temp会分别等于5、20、60、120
    rightAccu *= a[i + 1];
    // 乘以左边的乘积
    result[i] *= rightAccu;
  }
  return result;
};