zoukankan      html  css  js  c++  java
  • 剑指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;
    }
  • 相关阅读:
    bzoj1178/luogu3626 会议中心 (倍增+STL::set)
    suoi31 最近公共祖先2 (倍增lca)
    luogu4155/bzoj4444 国旗计划 (倍增)
    [BZOJ1864][Zjoi2006]三色二叉树
    [Luogu3070][USACO13JAN]岛游记Island Travels
    [Luogu2458][SDOI2006]保安站岗
    [BZOJ1191][HNOI2006]超级英雄Hero
    [BZOJ1050][HAOI2006]旅行
    [Luogu2973][USACO10HOL]赶小猪Driving Out the Piggi…
    [BZOJ1833][ZJOI2010]数字计数
  • 原文地址:https://www.cnblogs.com/wuguanglin/p/multiply.html
Copyright © 2011-2022 走看看