剑指offer 74. 构建乘积数组

简介: 剑指offer 74. 构建乘积数组

题目描述

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

不能使用除法。

数据范围

输入数组长度 [0,20]。


样例

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


思考题

  • 能不能只使用常数空间?(除了输出的数组之外)



方法一:空间复杂度为常数的算法 O(n)


由于题目限制不能使用除法,而且如果计算每个数都从前遍历一遍数组,时间复杂度就比较高。这里最优的做法就是动态的去更新数组信息,先计算每个数左边的乘积,再计算右边数的乘积。这样讲可能不那么直观,我们来看一个例子,假设给定数组 [1, 2, 3, 4, 5] 。


我们用一个容器 res 来存储答案,并且初始化 res[0] = 1 。


11f58208599a4d968928e42cca30e6d2.png

然后开始从左向右遍历数组,计算每个数左边数的乘积,并更新到 res 数组中。


590e1f4198a94e1c9a17524a8ad03a03.png


4cac07a2115c4b72ad715ffbb0dba2b1.png


d28e37e56b734ea89212e1a3b674fee9.png

c734b61ea96c46f1990081a3c74ef37b.png

最后再从右向左遍历数组,计算每个数右边的数的乘积,并将 res[i] 乘上右边数的乘积,就得到了除 A[i] 以外其它数的乘积。


e9ae5be2279d40f9b39f33dd2fb299eb.png

85af63565090404ea8fb2f9ac391ed95.png


f96c5e78143346da9b777a6b789206d7.png



1bc39eb289ac428a831bdf398c33a444.png


class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        if (A.empty())   return A;
        int n = A.size();
        vector<int> res(n);
        res[0] = 1;
        //先计算每个数左边的乘积
        for (int i = 1, p = A[0]; i < A.size(); i++)
        {
            res[i] = p;
            p *= A[i];
        }
        //再计算每个数右边的乘积
        for (int i = n - 2, p = A[n - 1]; i >= 0; i--)
        {
            res[i] *= p;
            p *= A[i];
        }
        return res;
    }
};

欢迎大家在评论区交流~

目录
相关文章
|
9月前
|
NoSQL Redis Docker
Docker——阿里云服务器利用docker搭建redis集群
本文详细记录了使用Docker搭建Redis集群的过程,包括检查Docker和Docker Compose的安装、创建Redis配置文件、编写`docker-compose.yml`文件、启动Redis节点、创建Redis集群的具体步骤,以及最终的验证方法。文章还提供了在多服务器环境下搭建Redis集群的注意事项,帮助读者全面了解 Redis 集群的部署流程。
1040 69
|
10月前
|
算法 前端开发 数据挖掘
旅鼠甄选模式系统开发
旅鼠甄选系统是基于当前短视频平台兴起的电商模式,旨在通过高质量的视频内容推广商品,实现销售转化。以下是一份详细的系统开发指南,旨在帮助您构建并运营一个成功的系统。
|
存储 NoSQL 搜索推荐
nosql
【10月更文挑战第14天】nosql
221 2
|
消息中间件 存储 数据可视化
【RocketMq-生产者】消息发送者参数详解
首先注意本次讨论的RokcetMq源码版本为 4.9.4,距离5.0发布 的没有多久。 这一节针对RocketMq的生产者请求发送的部分细节进行阐述,主要包含了下面的内容:DefaultMQProducer 为生产者默认对象,这个对象继承自 ClientConfig,里面包含了请求者的通用配置,所以可以拆分为两个部分进行理解,第一部分为ClientConfig,第二部分为DefaultMQProducer。
900 0
|
Python
VsCode集成Python开发环境
VsCode 环境下构建 Python 开发环境
502 0
VsCode集成Python开发环境
|
存储 缓存 Java
Android体系课-开源框架-这是一份详细的Glide源码分析文章
最近在`组件化`开发中准备封装一个`图片加载库`,于是乎就有了这篇文章 本篇文章对`Glide`源码过程做了一个详细的讲解,也是为了记录下自己对`Glide`的理解,以后忘记还可以从这里查找。
|
安全 测试技术 持续交付
软件开发、测试常用知识点总结与拓展
脚本(Script): 定义:脚本是一系列计算机指令的文本文件,通常用于自动化任务或执行特定的操作。它可以包括编程语言的代码或一系列命令。 用途:脚本用于自动化重复性任务、批处理作业、配置系统设置等。例如,Shell脚本、Python脚本和JavaScript脚本用于执行各种任务。 图解:通常,脚本的图示是一张文本文件图标,包括文件名和脚本内容的代码段。 队列(Queue): 定义:队列是一种数据结构,遵循FIFO(先进先出)原则,其中最早加入队列的元素最早被移除。队列通常用于管理和协调多个任务或进程之间的顺序执行。 用途:队列在计算机科学中用于任务调度、消息传递、数据缓冲等。例如,操作系统使
385 1
|
测试技术 PHP
不使用数字和字母的PHP webshell
不使用数字和字母的PHP webshell
344 0
|
存储 Java
[java进阶]——高级IO流家族,序列化流、打印流、压缩流、转换流
[java进阶]——高级IO流家族,序列化流、打印流、压缩流、转换流
109 0