题解 | #构建乘积数组#

构建乘积数组

http://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46

第七十七题
处理保存 该点的左右两边的乘积
class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        // 不能用除法 所以不能全部乘完再一个个除
        // 方法一 两次循环 每一个点单独求,显然不是想要的算法
        // 求出left right 两个数组,每次计算该点两边数组的乘积即可
        vector<int>left;
        vector<int>right;
        // 计算左右两边累乘的结果
        // 初始化 就是第一个
        left.push_back(A[0]);
        right.push_back(A[A.size()-1]);
        // 遍历保存左右两边的乘积
        for(int i=1;i<A.size()-1;i++)
        {
            left.push_back(left[i-1]*A[i]);
            right.push_back(right[i-1] * A[A.size()-i-1] );
        }
        vector<int> retans;
        
        // 左右两个边累乘结果输出
        /*
        for(int i=0;i<A.size()-1;i++)
        {
            cout<<left[i]<<" ";
        }
        cout<<endl;

        for(int i=0;i<A.size()-1;i++)
        {
            cout<<right[i]<<" ";
        }
        cout<<endl;
        */
        
        // 计算返回的结果
        for(int i=0;i<A.size();i++)
        {
            // 分别取该点的左边所有累乘的结果 * 该点右边累乘的结果
            // cout<<left[i-1]<<" "<<right[right.size()-i-1]<<endl;
            retans.push_back(left[i-1]*right[right.size()-i-1]);
        }
        // 修改第一个 和最后一个
        retans[0]=right[right.size()-1];
        retans[A.size()-1]=left[left.size()-1];
        return retans;
    }
};

题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务