zoukankan      html  css  js  c++  java
  • 剑指offer51:构建乘积数组B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1],不能使用除法

    1 题目描述

      给定一个数组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]。不能使用除法。

    2 思路和方法

    由于B[i] = (A[0] * A[1] * … * A[i-1]) * (A[i+1] * … * A[n-1])
    因此执行两趟循环:
    第一趟正向遍历数组,计算A[0] ~ A[i-1]的乘积,left[i]=A[0]*A[1]*…*A[i-1]
    第二趟反向遍历数组,计算A[i+1] ~ A[n-1]的乘积, right[i] = A[i+1]*A[i+2]*…*A[n-1]
    最后结果B[i]=left[i]*right[i]。

    第一步:B[0] = 1;  for(int i=1; i<len; ++i){B[i] = B[i-1] * A[i-1];} // A[0]* A[1]*..* A[i-1]。

    由于第二步求的是(A[i+1]*……*A[n-1]),所以for(int i = len-2;i>=0; --i){tmp *= A[i+1];  B[i] *= tmp; // * (A[i+1]*..*A[n-1])。

    3 C++核心代码

     1 class Solution {
     2 public:
     3     vector<int> multiply(const vector<int>& A) {
     4         int len = A.size();
     5         vector<int> B(len);
     6         if(len  <= 1) return B;
     7             
     8         B[0] = 1;
     9         for(int i=1; i<len; ++i){
    10             B[i] = B[i-1] * A[i-1]; // A[0]* A[1]*..* A[i-1]
    11         }
    12         
    13         int tmp = 1;
    14         for(int i = len-2;i>=0; --i){
    15             tmp *= A[i+1];
    16             B[i] *= tmp;        // * (A[i+1]*..*A[n-1])
    17         }
    18         return B;
    19     }
    20 };
    View Code

    参考资料

    https://blog.csdn.net/zjwreal/article/details/89054205

  • 相关阅读:
    谢尔宾斯基三角形,“混沌游戏”实现 20141022
    Who are you, What is the science
    The Tao to Excellent 2
    Mac Mini Server安装Centos6.5
    关于ftp的功能类——下载,上传,断点,连接
    mysql http://yaojialing.iteye.com/blog/773973
    序列号
    JS 文件复制
    java MySQLFront_Setup
    牛人博客
  • 原文地址:https://www.cnblogs.com/wxwhnu/p/11425794.html
Copyright © 2011-2022 走看看