首页/新闻资讯/正文详情

剑指Offer:构建乘积数组的高效解法

发布时间:2026/11/2 20:16:39 来源:云帆数科 栏目:资讯中心
剑指Offer:构建乘积数组的高效解法
1. 问题背景与核心挑战这道来自《剑指Offer》的经典算法题要求我们实现一个特殊数组的构建给定一个数组A需要构建一个新数组B其中B[i]的值等于数组A中除了A[i]之外所有元素的乘积。题目还特别强调了一个限制条件——不能使用除法运算。这个限制条件直接排除了最直观的解法先计算整个数组的乘积然后对每个元素除以A[i]得到B[i]。这种解法虽然简单但存在两个致命缺陷一是当数组中出现0时会导致除零错误二是题目明确禁止使用除法运算。2. 解题思路分析2.1 暴力解法及其缺陷最直接的思路是对于每个B[i]都遍历整个数组A跳过当前元素A[i]计算其余元素的乘积。这种方法的时间复杂度是O(n²)当数组较大时性能会急剧下降。def constructArr(a): b [1] * len(a) for i in range(len(b)): for j in range(len(a)): if i ! j: b[i] * a[j] return b2.2 优化思路分而治之更高效的解法是将问题分解为两个部分对于每个元素B[i]可以看作是其左边所有元素的乘积乘以其右边所有元素的乘积。这样我们就可以通过两次遍历来完成计算第一次从左到右遍历计算每个元素左边所有元素的乘积存入临时数组第二次从右到左遍历计算每个元素右边所有元素的乘积并与之前的结果相乘得到最终结果这种方法的时间复杂度是O(n)空间复杂度也是O(n)需要存储中间结果。3. 详细实现步骤3.1 初始化工作首先我们需要初始化结果数组B并将其所有元素设为1。同时我们还需要一个临时变量来存储累积的乘积。def constructArr(a): if not a: return [] length len(a) b [1] * length3.2 左遍历计算左下三角乘积从左到右遍历数组计算每个位置左边所有元素的乘积并存入结果数组B中。# 计算左下三角乘积 temp 1 for i in range(1, length): temp * a[i-1] b[i] temp3.3 右遍历计算右上三角乘积从右到左遍历数组计算每个位置右边所有元素的乘积并与之前的结果相乘得到最终结果。# 计算右上三角乘积并相乘 temp 1 for i in range(length-2, -1, -1): temp * a[i1] b[i] * temp return b3.4 完整代码实现将上述步骤组合起来得到完整的解决方案def constructArr(a): if not a: return [] length len(a) b [1] * length # 计算左下三角乘积 temp 1 for i in range(1, length): temp * a[i-1] b[i] temp # 计算右上三角乘积并相乘 temp 1 for i in range(length-2, -1, -1): temp * a[i1] b[i] * temp return b4. 算法复杂度分析4.1 时间复杂度该算法只需要两次遍历数组每次遍历的时间复杂度都是O(n)因此总的时间复杂度是O(n)。4.2 空间复杂度除了结果数组B外我们只使用了常数级别的额外空间temp变量因此空间复杂度是O(1)不考虑结果数组的空间。5. 边界条件与特殊测试用例5.1 空数组输入assert constructArr([]) []5.2 单元素数组assert constructArr([5]) [1]5.3 包含0的数组assert constructArr([1, 0, 3, 4]) [0, 12, 0, 0]5.4 全1数组assert constructArr([1, 1, 1, 1]) [1, 1, 1, 1]6. 实际应用场景这种构建乘积数组的算法在实际开发中有多种应用场景图像处理在计算像素邻域统计量时可能需要排除中心像素的影响数据分析计算某些统计指标时需要排除当前数据点的影响推荐系统计算用户相似度时可能需要排除某些特定项目的影响7. 常见错误与调试技巧7.1 索引越界问题在实现过程中特别要注意数组索引的范围。例如在右遍历时起始索引应该是length-2而不是length-1。7.2 初始值设置临时变量temp的初始值应该设置为1而不是0否则所有乘积结果都会变成0。7.3 边界条件处理需要特别注意空数组和单元素数组的特殊情况避免在这些情况下出现错误。8. 算法优化空间虽然这个算法已经相当高效但仍有一些可能的优化方向空间优化可以尝试将中间结果存储在输入数组中如果允许修改输入数组并行计算对于超大数组可以考虑将左右乘积的计算并行化缓存优化对于频繁调用的场景可以考虑缓存中间结果9. 类似题目扩展掌握这个算法后可以尝试解决以下类似题目LeetCode 238. Product of Array Except Self计算数组所有子数组的乘积计算数组中每个元素左边/右边小于它的元素个数10. 个人实现心得在实际编码实现时我发现以下几点特别值得注意画图辅助理解通过绘制数组元素的乘积关系图可以更直观地理解算法的运作机制分步验证先实现左遍历部分验证结果正确后再实现右遍历部分测试驱动开发先编写测试用例再实现功能代码可以确保各种边界条件都被覆盖这个问题的解法展示了如何通过巧妙的分解将看似复杂的问题简化为可管理的子问题。这种分而治之的思想在算法设计中非常常见掌握这种思维方式对解决其他算法问题也大有裨益。

相关推荐

研究生开题报告的参考文献,按方向分三组更好列,硕词AI(官方网站:www.shuociai.com)给了分法
研究生开题报告的参考文献,按方向分三组更好列,硕词AI(官方网站:www.shuociai.com)给了分法

研究生开题报告的参考文献,最常见的列法是按投稿时间顺序从前往后堆,二三十篇排下来,导师扫一眼就知道哪些是凑数的。换个列法,按方向分三组:理论支撑组、方法借鉴组、同类研究组,每组选文标准明确&#xf… · 2026/11/2 20:16:39

自动驾驶MPC轨迹跟踪控制实践与优化
自动驾驶MPC轨迹跟踪控制实践与优化

1. 项目背景与核心挑战在自动驾驶技术快速发展的今天,模型预测控制(MPC)因其优秀的处理约束能力和预测特性,已成为车辆轨迹跟踪控制的主流方案。不同于传统的PID控制,MPC能够同时考虑车辆动力学约束、道路边界限制以及… · 2026/11/2 20:15:38

递归算法:从基础到竞赛实战全解析
递归算法:从基础到竞赛实战全解析

1. 递归:算法竞赛中的思维利器第一次接触递归时,我完全被它绕晕了。那是在大一的程序设计课上,老师用斐波那契数列举例,屏幕上短短几行代码竟然能自动计算出任意项的值。当时觉得这简直像魔法——直到我自己尝试写递归函数时&… · 2026/11/2 20:15:38

从零学AI工程:数据、部署、监控的避坑指南与实战路线
从零学AI工程:数据、部署、监控的避坑指南与实战路线

从零开始学AI工程:我踩过的坑,和真正值得走的路线“ai engineering from scratch”这个话题,我其实一开始是带着怀疑的——两年前市面上讲AI的课程,十个里面有九个都在教你怎么调sklearn、怎么跑通一个pytorch的官方demo&#xff… · 2026/11/2 20:57:01

机器人学习数据格式转换工具lerobot_convertor详解
机器人学习数据格式转换工具lerobot_convertor详解

1. 项目概述 lerobot_convertor 是一个专为机器人学习领域设计的轻量级数据格式转换框架,它的核心功能是将各类机器人数据集统一转换为 LeRobot 兼容格式。这个工具解决了多源数据标准化处理的痛点,特别适合需要快速整合不同来源数据集进行模型训练的研究… · 2026/11/2 20:57:01

能源行业零信任与纵深防御融合架构实践
能源行业零信任与纵深防御融合架构实践

1. 能源行业安全架构的现状与挑战能源行业作为国家关键基础设施的核心组成部分,其信息系统安全直接关系到国计民生。近年来,随着数字化转型的深入,能源企业面临着前所未有的安全挑战。传统基于边界防护的安全架构在面对新型威胁时显得力不从心… · 2026/11/2 20:57:01

从零构建AI工程体系:Python/TS/Rust/Julia四语言协同实践
从零构建AI工程体系:Python/TS/Rust/Julia四语言协同实践

1. 为什么“从零构建AI工程体系”不是一句空话,而是当前最真实的生存需求“ai-engineering-from-scratch”这个标题乍看像一门课程名,或是某本技术书的副标题。但如果你最近半年深度参与过至少一个落地AI项目——无论是给内部业务部门搭一个能跑通的RAG知… · 2026/11/2 20:57:01

Doma框架常见问题排查:编译期SQL校验与工程实践
Doma框架常见问题排查:编译期SQL校验与工程实践

接手一个用Doma框架维护的存量项目时,最先撞上的往往不是业务逻辑,而是满屏的编译期报错:SQL文件找不到、绑定变量对不上、生成的DAO实现类飘红。Doma这套Java数据库访问框架的思路很特别,它把SQL从Java代码里彻底抽出来放进独立的… · 2026/11/2 20:57:01

VGG19图像分类迁移学习:冻结策略与验收避坑指南
VGG19图像分类迁移学习:冻结策略与验收避坑指南

简介:面向智能计算系统课程实验与深度学习部署入门者,这份实验4-1资料围绕VGG19图像分类任务,提供从卷积网络推理到硬件加速评估的实践素材,适合需要理解模型量化与不同计算平台性能差异的学习者。压缩包共4个文件,由3… · 2026/11/2 20:56:00

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

雷达信号调制技术解析:从LFM到伪线性调频原理与应用
雷达信号调制技术解析:从LFM到伪线性调频原理与应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略
基于MAX14431与TM4C123的工业SPI隔离电路设计全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

PLFM_RADAR:相位线性调频雷达信号处理框架
PLFM_RADAR:相位线性调频雷达信号处理框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 1:01:15

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码