zoukankan      html  css  js  c++  java
  • 【剑指offer】构建乘积数组(注意优化空间)

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

    思路:本题的关键在于不能使用除法。故需要分别计算A[0]~A[i - 1] 的乘积 和 A[i + 1]~A[n - 1]的乘积。

    可以用两个for循环,一次计算0~i-1的乘积,一次计算i+1~n-1的乘积。

    注意:A[0]*A[0-1] 按 1算  A[n - 1 + 1]*A[n - 1]也按 1 算。

    精简的代码:

    vector<int> multiply2(const vector<int>& A)
        {
            if(A.size() < 2)
                return vector<int>();
    
            vector<int> B;
            int value = 1;
            B.push_back(value);
            for(int i = 1; i < A.size(); i++)
            {
                value *= A[i - 1];
                B.push_back(value);
            }
            value = 1;
            for(int i = A.size() - 2; i >= 0; i--)
            {
                value *= A[i + 1];
                B[i] *= value;
            }
            return B;
        }

    我自己写的,用了过多的冗余空间。

    vector<int> multiply(const vector<int>& A) {
            if(A.size() < 2)
                return vector<int>();
            vector<int> B;
            vector<int> M0(A.size(), 1), Mn(A.size(), 1);
            M0[0] = A[0];
            Mn.back() = A.back();
            for(int i = 1; i < A.size() - 1; i++)
                M0[i] = M0[i - 1] * A[i];
            for(int i = A.size() - 2; i >= 1; i--)
                Mn[i] = Mn[i + 1] * A[i];
            for(int i = 0; i < A.size(); i++)
            {
                int b = ((i - 1 < 0) ? 1 : M0[i - 1]) * ((i + 1 >= A.size()) ? 1 : Mn[i + 1]);
                B.push_back(b);
            }
            return B;
            
        }
  • 相关阅读:
    P1270 【“访问”美术馆】
    SP14932 【LCA
    NOI 题库 9272 题解
    Code[VS] 1230 题解
    20161022 NOIP模拟赛 T1 解题报告
    20161023 NOIP 模拟赛 T2 解题报告
    20161023 NOIP 模拟赛 T1 解题报告
    20161022 NOIP模拟赛 解题报告
    POJ 1979 题解
    POJ 1160 题解
  • 原文地址:https://www.cnblogs.com/dplearning/p/4673220.html
Copyright © 2011-2022 走看看