zoukankan      html  css  js  c++  java
  • 剑指OFFER_构建乘积数组

    剑指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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

    思路

    由于不让使用除法,我只能想到挨个相乘的笨办法,但是这种办法肯定会超时。我没找到更好的办法的情况下去看了题解:

    图片说明

    题目把A[i]分为了左右两个部分,left=A[0] * ……A[i-1];right=A[i+1] * …… A[n-1],如同图中所示。

    那么就可以把蓝色区域和红色区域作为数组计算出来,然后构建B[i]的时候将左右两个部分相乘即可,代码如下:

    代码

    typedef vector<int> vec;
    class Solution {
    public:
        vector<int> multiply(const vector<int>& A) {
            int len = A.size();
            vec ans = vec(len);
            vec front_order = vec(len);
            vec back_order = vec(len);
            
            front_order[0] = back_order[len-1] = 1;
            for (int i=1; i<len; i++) {
                front_order[i] = front_order[i-1]*A[i-1];
            }
            for (int i=len-2; i>=0; i--) {
                back_order[i] = back_order[i+1]*A[i+1];
            }
            for (int i=0; i<len; i++) {
                ans[i] = front_order[i] * back_order[i];
            }
            return ans;
        }
    };
    
  • 相关阅读:
    MySQL之存储过程和函数
    Mysql中的常用函数:
    Mysql之使用Mysql运算符
    Mysql之单表记录查询
    Mysql之触发器的操作:
    Mysql之视图的操作
    Mysql之表的操作与索引操作
    Mysql之基本操作与数据类型
    Java多线程之生产者消费者
    Java多线程
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/13291904.html
Copyright © 2011-2022 走看看