zoukankan      html  css  js  c++  java
  • 【剑指Offer】面试题66. 构建乘积数组

    题目

    给定一个数组 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]。不能使用除法。

    示例:

    输入: [1,2,3,4,5]
    输出: [120,60,40,30,24]
    

    提示:

    • 所有元素乘积之和不会溢出 32 位整数
    • a.length <= 100000

    思路

    res[i] 位置数等于 i 位置前后所有数累积。分别计算从前向后和从后向前所有数累积数组,如:
    1 2 3 4 5
    从前向后累积数组front[i]:1 2 6 24 120
    从后向前累积数组back[i]: 120 120 60 20 5
    当i为开头或结尾位置时,前后位置数为1,其它位置数res[i] = front[i - 1] * back[i + 1]

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        vector<int> constructArr(vector<int>& a) {        
            int size = a.size();       
            vector<int> res(size, 1);
            vector<int> front(a), back(a);        
            for (int i = 1; i < size; ++i) {
                front[i] = front[i - 1] *a[i];
            }
            for (int i = size - 2; i >= 0; --i) {
                back[i] = back[i + 1] * a[i];
            }
            for (int i = 0; i < size; ++i) {
                if (i > 0) res[i] *= front[i - 1];
                if (i < size - 1) res[i] *= back[i + 1];
            }        
            return res;
        }
    };
    
  • 相关阅读:
    Scrapy框架
    描述符类
    完整的blog设计过程
    钉钉机器人设置步骤
    homework登录和支付mock两个接口
    jsonpath的用法和nnlog的使用
    mp4格式文件转码后处理(qt-faststart).md
    html5视音频标签参考.md
    ffmpeg文档43-开发者
    ffmpeg文档42-参考/看
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12853117.html
Copyright © 2011-2022 走看看