数组-构建乘积数组(思路和代码实现)

KLQ 2020-04-14 16:35:56 java常见问答 7880

下面要给大家分享的是和数组有关的内容,具体内容为构建乘积数组的思路和代码实现,感兴趣的小伙伴可以来了解一下。

题目:

给定一个数组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];

思路1:

分析:

解释下代码,设有数组大小为5。

对于第1个for循环

第1步:b[0] = 1;

第2步:b[1] = b[0] * a[0] = a[0]

第3步:b[2] = b[1] * a[1] = a[0] * a[1];

第4步:b[3] = b[2] * a[2] = a[0] * a[1] * a[2];

第5步:b[4] = b[3] * a[3] = a[0] * a[1] * a[2] * a[3];

然后对于第2个for循环

第1步

temp *= a[4] = a[4];

b[3] = b[3] * temp = a[0] * a[1] * a[2] * a[4];

第2步

temp *= a[3] = a[4] * a[3];

b[2] = b[2] * temp = a[0] * a[1] * a[4] * a[3];

第3步

temp *= a[2] = a[4] * a[3] * a[2];

b[1] = b[1] * temp = a[0] * a[4] * a[3] * a[2];

第4步

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]均已经得到正确计算。

代码实现:

class Solution
{
    public:
        vector < int > multiply(const vector < int > & A)
        {
            vector < int > vec;
            int sz = A.size();
            if (sz == 0)
                return vec;
            vec.push_back(1);
            for (int i = 0; i < sz - 1; i++)
                vec.push_back(vec.back() * A[i]);
            int tmp = 1;
            for (int i = sz - 1; i >= 0; i--)
            {
                vec[i] = vec[i] * tmp;
                tmp = tmp * A[i];
            }
            return vec;
        }
};

思路2:

B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]

从左往右算 B[i]=A[0]*A[1]*...*A[i-1]

从右往左算B[i]*=A[i+1]*...*A[n-1]

代码实现:

class Solution
{
    public:
        vector < int > multiply(const vector < int > & A)
        {
            int n = A.size();
            vector < int > b(n);
            int ret = 1;
            for (int i = 0; i < n; ret *= A[i++])
            {
                b[i] = ret;
            }
            ret = 1;
            for (int i = n - 1; i >= 0; ret *= A[i--])
            {
                b[i] *= ret;
            }
            return b;
        }
};

思路3:

B[i]的值可以看作下图的矩阵中每行的乘积。

构建乘积数组

下三角用连乘可以很容求得,上三角,从下向上也是连乘。

所以,思路就非常清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

代码实现:

public class Solution
{
    public int[] multiply(int[] A)
    {
        int length = A.length;
        int[] B = new int[length];
        if (length != 0)
        {
            B[0] = 1;
            //计算下三角连乘
            for (int i = 1; i < length; i++)
            {
                B[i] = B[i - 1] * A[i - 1];
            }
            int temp = 1;
            //计算上三角
            for (int j = length - 2; j >= 0; j--)
            {
                temp *= A[j + 1];
                B[j] *= temp;
            }
        }
        return B;
    }
}

构建乘积数组的思路和代码实现大家都清楚了吗?以上内容大家可以参考一下,希望可以帮助到大家。

更多的Java实例,可以继续关注本站的Java实例专栏了解哦。