剑指offer面试题66:构建乘积数组

索引请参考:系列目录
题目:

  • 给定一个数组A[0,1,…,n-1],构建一个数组B[0,1,…,n-1],其中B中的元素B[ i ] = A[0] * A[1] * … * A[n - 1]。不能使用除法。(注:规定B[0] = A[1] * A[2]* …* A[n - 1],B[n - 1] = A[0] * A[1]* …* A[n - 2])
  • 对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。

分析:

  • 思路1:暴力法(具体请参考代码)
  • 思路2:
    在这里插入图片描述
    left[i] = A[0] * A[1] * … * A[i - 1]
    righr[i] = A[i + 1] * A[i + 2] * … * A[n - 1]
    B[i] = left[i] * righr[i]
    left[i + 1] = left[i] * A[i]
    righr[i] = righr[i + 1] * A[i + 1]

思路1:

vector<int> multiply(const vector<int>& A) {
        int size = A.size();
        vector<int>B;
        for(int i = 0;i < size; i++)
        {
            int result = 1;
            for(int j = 0;j < size;j++)
            {
                if(i == j)
                    continue;
                result *= A[j];
            }
            B.push_back(result);
        }
        return B;
    }

牛客运行结果:
在这里插入图片描述
思路2:

vector<int> multiply(const vector<int>& A) {
        vector<int>B(A.size(),1);
        
        for(int i = 1;i < A.size();i++)
            B[i] = B[i -1] * A[i - 1];//left
        int temp = 1;
        for(int i = A.size() - 2;i >= 0;i--)
        {
            temp *= A[i + 1];
            B[i] *= temp;
        }
        return B;
    }

牛客运行结果:
在这里插入图片描述
评注:本人对牛客运行结果持怀疑态度,原因:
思路1的时间复杂度为O(n^2),思路2时间复杂度为O(n).
当测试数据足够大时,算法速率会有明显差异的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值