剑指offer(C++)-JZ66:构建乘积数组(算法-其他)

简介: 剑指offer(C++)-JZ66:构建乘积数组(算法-其他)

题目描述:

给定一个数组 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](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])


对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。


数据范围:1≤n≤10  ,数组中元素满足∣val∣≤10

示例:

输入:

[1,2,3,4,5]


返回值:

[120,60,40,30,24]

解题思路:

本题考察算法思维。如下图所示,已知A,求B。解题思路如下:


  1. B[n]=除了A[n]之外所有A乘积,那么基于下表可以将B的乘积序列以n为分界线,分为前后两部分。
  2. 先累积n之前的A,顺序执行,B[n]=B[n-1]*A[n-1]。
  3. 再累积n之后的A,倒序执行,B[n]=B[n]*temp,其中temp从1开始累积A,即temp=1*A[n-1]*A[n-2].......*A[1]。

测试代码:

class Solution {
public:
    // 乘积
    vector<int> multiply(vector<int>& A) {
        int size = A.size();
        vector<int> B(size, 1);
        // 累积n之前的A
        for(int i = 1; i < size; ++i){
            B[i] = B[i - 1] * A[i - 1];
        }
        // 累积n之后的A
        int temp = 1;
        for(int i = size - 1; i >= 0; --i){
            B[i] *= temp;
            temp *= A[i];
        }
        return B;
    }
};
相关文章
|
8天前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
13 0
|
5天前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
22 3
|
9天前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
33 10
|
11天前
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
9 1
|
12天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
1天前
|
存储 算法 Java
Java数据结构与算法:线性数据结构之数组
Java数据结构与算法:线性数据结构之数组
|
1天前
|
算法 前端开发 安全
C++算法模板
C++算法模板
3 0
|
5天前
|
算法
【洛谷 P1003】[NOIP2011 提高组] 铺地毯 题解(数组+贪心算法)
**NOIP2011 提高组问题:铺地毯** 在第一象限的颁奖典礼场地,有$n$张地毯按编号顺序铺设。需找出覆盖特定点$(x, y)$的最上方地毯编号。输入包括地毯坐标和点坐标,输出地毯编号或-1表示未覆盖。 样例:给定3张地毯,点$(2,2)$被第3张地毯覆盖,输出3;另一样例点$(4,5)$未被覆盖,输出-1。 $30\%$数据$n\leq2$,$50\%$数据坐标$\leq100$,$100\%$数据$n\leq10^4$,坐标$\leq10^5$。 解决方法:从下到上遍历地毯,更新覆盖点的地毯编号。 AC代码略。
5 0
|
12天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
12天前
|
算法 C++
【c/c++算法】曼哈顿算法简单运用
【c/c++算法】曼哈顿算法简单运用