zoukankan      html  css  js  c++  java
  • 剑指offer系列——51.构建乘积数组

    Q:给定一个数组(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:
    解释下代码,设有数组大小为5。
    对于第一个for循环
    第一步:(b[0] = 1);
    第二步:(b[1] = b[0] * a[0] = a[0]);
    第三步:(b[2] = b[1] * a[1] = a[0] * a[1]);
    第四步:(b[3] = b[2] * a[2] = a[0] * a[1] * a[2]);
    第五步:(b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3]);
    然后对于第二个for循环
    第一步
    (temp *= a[4] = a[4]);
    (b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4]);
    第二步
    (temp *= a[3] = a[4] * a[3]);
    (b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3]);
    第三步
    (temp *= a[2] = a[4] * a[3] * a[2]);
    (b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2]);
    第四步
    (temp *= a[1] = a[4] * a[3] * a[2] * a[1]);
    (b[0] = b[0] * temp = a[4] * a[3] * a[2] * a[1]);
    由此可以看出从b[4]到b[0]均已经得到正确计算。

        vector<int> multiply(const vector<int> &A) {
            vector<int> result;
            if (A.empty())
                return result;
            result.push_back(1);
            for (int i = 1; i < A.size(); i++)
                result.push_back(A[i - 1] * result[i - 1]);
            int temp = A[A.size() - 1];
            for (int i = A.size() - 2; i >= 0; i--) {
                result[i] = result[i] * temp;
                temp = temp * A[i];
            }
            return result;
        }
    
  • 相关阅读:
    人类历史上最智慧的169条警世箴言(句句珠玑,发人深省)
    最负责任的回答
    成大事必须依靠的五种人
    一生的伤痕
    有谁愿意陪我一程
    惜缘
    那朵美丽的格桑花,你是否依然绽放?
    今生今世只等你
    成就一生的15条黄金法则
    遇到困难挫折也不要悲观:每个人生来就是冠军(转)
  • 原文地址:https://www.cnblogs.com/xym4869/p/12350546.html
Copyright © 2011-2022 走看看