剑指offer——构建乘积数组

构建乘积数组

https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46?tpId=13&&tqId=11204&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

图片说明
解读题目:
其实,我个人感觉有很多题目不是难,而是还没有真正弄懂题目意思就动手写代码,题目也是需要深刻思考的
数组A:有n个元素的递增数组,递增范围:0-n-1
数组B:看重点:B[i]= A[0]A[1]A[2]……A[i-1]A[i+1]A[n-1],也就是说数组B的第i个元素的值为A数组除A[i]以外的累乘积和
思路1:可以求总的乘积除以当前的A[i],但是题目规定不能用除法
思路2:将A[i]的值设置为1,这样的话,再累乘也不影响最后结果,也满足题意

步骤:
1.构建和A大小相同的数组 B
vector <int> B(A.size());
2.第一个for循环,计算0-A.size()之间B[i]的大小
相当于是在B[i]前面的值都还没有与B[i]后面的值相乘,只是一个累乘
3.第二个for循环,计算A.size()-1到0之间之间B[i]的大小
在上面一个for循环计算出了累成结果的基础上,在乘上B[i]右变的数字</int>

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int right = 1;
    //创建一个动态数组B,全部置为1
        int lengthA = A.size();
        vector <int> B(lengthA);
        //开始循环,第一个循环得到B数组的0~i-1个值
        for (int i = 0;i<lengthA;i++)
        {
            B[i] = right;//B[i]为i左边乘积
            right *= A[i];
        }
        //将前面的值堪称A[i]置为1
        right = 1;
        //第二个循环,是从右边相乘到i+1
        for(int j=lengthA - 1;j>=0;j--)
        {
            B[j]*= right;//得到右变的值
            right *= A[j];//与左边相乘
        }
        return B;
    }
};

不知道为啥 * =给我报错。。。

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
04-08 00:50
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务