zoukankan      html  css  js  c++  java
  • 面试题66:构建乘积数组(C++)

    题目地址:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/

    题目描述

    给定一个数组 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]

    解题思路

    分析题目,我们发现B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]是A[i]左边所有元素与A[i]右边所有元素乘积,所以,我们可以用两个数组C、D分别存放A[i]左边所有元素乘积与A[i]右边所有元素乘积,最后,数组B[i]=C[i] * D[i],其中,C[i]表示a数组从第0项乘到i-1项的乘积,其值,C[i] = C[i-1] * a[i-1],D[i]表示从i+1到n-1项的乘积,其值D[i]=D[i+1]*A[i+1]

    程序源码

    class Solution {
    public:
        vector<int> constructArr(vector<int>& a) {
         if(a.empty()) return {};
    int len = a.size(); vector<int> b(len, 1); //B[i] = C[i] * D[i] vector<int> c(len, 1); //A[i]左边元素乘积,即下三角 vector<int> d(len, 1); //A[i]右边元素乘积,即上三角 for(int i = 1; i < len; i++) { c[i] = c[i - 1] * a[i - 1]; //遍历求C值 } for(int j = len - 2; j >= 0; j--) { d[j] = d[j + 1] * a[j + 1]; //遍历求D值 } for(int i = 0 ; i < len; i++) { b[i] = c[i] * d[i]; //遍历求B值 } return b; } };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    JZOI 4020 Revolution
    JZOJ 4018 Magic
    JZOJ 4017 逃跑
    JZOJ 4016 圈地为王
    JZOJ 4015 数列
    JZOJ 3960 鸡腿の出行
    BZOJ 5005 & JZOI 3959 鸡腿の乒乓
    GCJ2009B&JZOJ 4033 Min Perimeter
    jzoj 3948 Hanoi 塔
    [纯符][纯粹的无聊] 神奇的递推式
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12830946.html
Copyright © 2011-2022 走看看