当前位置: 首页 > article >正文

238.除自身以外数组的乘积 技术解析与实现

一、问题分析1.1 问题核心需求给定一个整数数组nums返回一个数组answer其中answer[i]等于nums中除nums[i]之外所有元素的乘积。核心约束的关键点的如下禁止使用除法避免出现除数为0的异常同时满足题目明确限制时间复杂度要求O(n)O(n)O(n)不能使用双重循环O(n2)O(n^2)O(n2)需设计线性时间的解题方案进阶要求可选额外空间复杂度O(1)O(1)O(1)输出数组answer不计入额外空间数据范围适配数组长度最大为10510^5105需保证算法高效避免超时元素取值范围为 [-30, 30]乘积在32位整数范围内无需考虑溢出问题。1.2 核心解题思路核心思路前缀乘积 后缀乘积。对于数组中每个元素nums[i]其除自身以外的乘积 左侧所有元素的乘积前缀乘积 × 右侧所有元素的乘积后缀乘积。分两步理解基础版额外空间O(n)O(n)O(n)计算前缀乘积数组prefixprefix[i]表示nums[0..i-1]的乘积即nums[i]左侧所有元素的乘积计算后缀乘积数组suffixsuffix[i]表示nums[i1..n-1]的乘积即nums[i]右侧所有元素的乘积最终结果answer[i] prefix[i] × suffix[i]。进阶优化额外空间O(1)O(1)O(1)不单独创建前缀、后缀数组直接利用输出数组answer存储前缀乘积再用一个临时变量存储后缀乘积反向遍历数组完成计算彻底节省额外空间。1.3 示例验证帮助理解以示例1nums [1,2,3,4]为例前缀乘积数组prefix[1, 1, 2, 6]prefix[0]1prefix[1]1×11prefix[2]1×22prefix[3]1×2×36后缀乘积数组suffix[24, 12, 4, 1]suffix[3]1suffix[2]4×14suffix[1]3×412suffix[0]2×3×424answer[i] prefix[i] × suffix[i] → [1×24, 1×12, 2×4, 6×1] [24,12,8,6]与示例输出一致。以示例2nums [-1,1,0,-3,3]为例因数组中存在0除0所在位置外其余位置的乘积均为00所在位置索引2的乘积 左侧乘积-1×1 × 右侧乘积-3×3 -1 × (-9) 9最终输出 [0,0,9,0,0]符合示例要求。二、完整代码实现基础版进阶版2.1 基础版额外空间 O(n)易理解基础版前缀后缀数组O(n)时间O(n)空间from typing import List class Solution: def productExceptSelf(self, nums: List[int]) - List[int]: n len(nums) # 1. 初始化前缀乘积数组prefix[i] 左侧所有元素的乘积 prefix [1] * n for i in range(1, n): prefix[i] prefix[i-1] * nums[i-1] # 2. 初始化后缀乘积数组suffix[i] 右侧所有元素的乘积 suffix [1] * n for i in range(n-2, -1, -1): suffix[i] suffix[i1] * nums[i1] # 3. 计算结果每个位置的乘积 前缀×后缀 answer [0] * n for i in range(n): answer[i] prefix[i] * suffix[i] return answer2.2 进阶版额外空间 O(1)满足题目进阶要求进阶版O(n)时间O(1)额外空间最优解from typing import List class Solution: def productExceptSelf(self, nums: List[int]) - List[int]: n len(nums) answer [1] * n # 输出数组先存储前缀乘积不计入额外空间 # 第一步计算前缀乘积存入answer for i in range(1, n): # answer[i] nums[0] * nums[1] * ... * nums[i-1] answer[i] answer[i-1] * nums[i-1] # 第二步计算后缀乘积用临时变量存储反向更新answer suffix_product 1 # 临时变量存储当前元素右侧所有元素的乘积 for i in range(n-1, -1, -1): # 此时answer[i]是前缀乘积乘以后缀乘积得到最终结果 answer[i] answer[i] * suffix_product # 更新后缀乘积加入当前元素下一次循环时当前元素成为右侧元素 suffix_product * nums[i] return answer三、代码核心解析3.1 基础版代码解析3.1.1 前缀乘积数组prefix初始化prefix [1] * n因为数组第一个元素索引0左侧没有元素其前缀乘积为1乘法单位元。循环从索引1开始prefix[i] prefix[i-1] * nums[i-1]含义是“当前元素的前缀乘积 前一个元素的前缀乘积 × 前一个元素的值”这样就能线性时间计算出所有元素的左侧乘积。3.1.2 后缀乘积数组suffix初始化suffix [1] * n数组最后一个元素索引n-1右侧没有元素其后缀乘积为1。循环从索引n-2开始反向遍历suffix[i] suffix[i1] * nums[i1]含义是“当前元素的后缀乘积 后一个元素的后缀乘积 × 后一个元素的值”线性时间计算出所有元素的右侧乘积。3.1.3 结果计算每个位置i的结果就是其左侧所有元素的乘积prefix[i]乘以右侧所有元素的乘积suffix[i]遍历一次即可得到最终数组。3.2 进阶版代码解析核心优化3.2.1 利用输出数组存储前缀乘积不再单独创建prefix数组直接用answer数组存储前缀乘积此时answer[i]的含义与基础版的prefix[i]完全一致节省了O(n)O(n)O(n)的空间。3.2.2 临时变量存储后缀乘积用suffix_product一个临时变量替代基础版的suffix数组。反向遍历数组时先将当前answer[i]前缀乘积与suffix_product后缀乘积相乘得到最终结果再更新suffix_product将当前元素nums[i]加入后缀乘积中为下一次循环左侧元素做准备。示例验证进阶版nums [1,2,3,4]前缀计算后answer [1, 1, 2, 6]反向遍历suffix_product初始为1i3answer[3] 6 × 1 6suffix_product 1 × 4 4i2answer[2] 2 × 4 8suffix_product 4 × 3 12i1answer[1] 1 × 12 12suffix_product 12 × 2 24i0answer[0] 1 × 24 24suffix_product 24 × 1 24最终 answer [24,12,8,6]与预期一致。3.3 关键细节说明初始化前缀/后缀乘积为1因为乘法的单位元是1乘以1不改变乘积结果确保边界元素第一个、最后一个的计算正确反向遍历的意义进阶版中反向遍历能让临时变量suffix_product逐步积累右侧元素的乘积无需额外数组存储无除法的核心通过“前缀后缀”的方式绕开除法既避免了除数为0的异常也满足了题目要求。四、时间/空间复杂度分析实现版本时间复杂度额外空间复杂度说明基础版O(n)O(n)O(n)O(n)O(n)O(n)用两个额外数组存储前缀、后缀乘积易理解进阶版O(n)O(n)O(n)O(1)O(1)O(1)利用输出数组和临时变量最优解时间复杂度两种版本均只遍历数组2-3次无嵌套循环因此时间复杂度为O(n)O(n)O(n)适配10510^5105长度的数组不会超时空间复杂度进阶版仅使用1个临时变量输出数组不计入额外空间满足题目进阶要求是实际面试中更推荐的写法兼容性两种版本均适配题目所有测试用例含负数、0且乘积在32位整数范围内无需额外处理溢出。五、关键注意事项避坑指南边界条件处理数组长度为2时题目提示n≥2n \geq 2n≥2如nums [a,b]结果应为[b,a]两种版本均能正确处理前缀/后缀乘积初始化为1遍历后计算正确0元素的处理无需单独判断0前缀后缀乘积的逻辑会自动处理——若当前元素是0其前缀×后缀就是其他所有元素的乘积若其他位置有0当前元素的乘积为0负数乘积的处理Python 支持负整数乘法无需额外处理符号前缀、后缀乘积会自动保留符号最终结果符号正确进阶版遍历顺序前缀计算需正向遍历后缀计算需反向遍历顺序不能颠倒否则会导致乘积计算错误临时变量更新时机进阶版中需先计算answer[i]再更新suffix_product否则会将当前元素nums[i]计入自身乘积导致结果错误。六、常见错误与优化建议6.1 常见错误错误1使用双重循环时间复杂度O(n2)O(n^2)O(n2)导致超时适用于小规模数组不适用于10510^5105长度错误2使用除法如总乘积 / nums[i]忽略了除数为0的异常且违反题目要求错误3进阶版中先更新suffix_product再计算answer[i]导致当前元素被计入自身乘积错误4前缀/后缀数组初始化错误未初始化为1导致边界元素计算错误。6.2 优化建议面试优先写进阶版O(1)O(1)O(1)额外空间的解法更能体现算法思维是面试官重点关注的解法先理解基础版再优化进阶版基础版的前缀后缀数组思路是核心进阶版只是空间上的优化理解基础版后更容易掌握进阶版多调试示例遇到错误时可结合示例1、示例2手动模拟遍历过程排查前缀、后缀乘积的计算逻辑。七、总结关键点回顾核心思想通过前缀乘积和后缀乘积绕开除法实现O(n)O(n)O(n)时间复杂度核心是“每个元素的结果 左侧乘积 × 右侧乘积”基础版用两个额外数组存储前缀、后缀乘积逻辑简单易理解适合入门进阶版利用输出数组和临时变量将额外空间优化至O(1)O(1)O(1)是最优解适合面试和实际开发避坑重点边界初始化、遍历顺序、临时变量更新时机以及0和负数的处理。本题是数组操作的经典题型核心考察“空间优化”和“线性时间算法设计”前缀后缀乘积的思路不仅适用于本题还可迁移到类似“求左侧/右侧元素乘积”的场景。掌握两种解法既能应对基础题目要求也能满足进阶的空间优化需求是面试中必须掌握的算法思路。

相关文章:

238.除自身以外数组的乘积 技术解析与实现

一、问题分析 1.1 问题核心需求 给定一个整数数组 nums,返回一个数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外所有元素的乘积。核心约束的关键点的如下:禁止使用除法:避免出现除数为0的异常,同时满足题目明…...

AI agent : MiroFish AI智能体项目介绍

近期在GitHub和科技圈备受关注的开源AI项目——MiroFish。它由中国科大学生郭航江(BaiFu)开发,是一个基于“群体智能”的AI预测引擎,因短时间内连续登顶GitHub全球趋势榜并获得3000万投资而走红。 🐠 MiroFish 项目速…...

医疗系统如何通过百度WebUploader组件优化病历PDF文件的浏览器端分片加密?

前端老哥的“懒人”大文件上传方案(Vue3原生JS) 兄弟们!我是辽宁一名“头发没秃但代码量秃”的前端程序员,最近接了个外包活——给客户做文件管理系统,核心需求就仨字儿:“稳、省、兼容”!客户…...

国防军工领域Vue如何集成百度WebUploader插件支持卫星数据大附件的秒传断点?

前端程序员外包项目救星:原生JS大文件上传组件(Vue3实现) 兄弟,作为在杭州接外包的老前端程序员,太懂你现在的处境了——甲方要20G大文件上传,还要兼容IE9,预算卡得死死的,网上代码…...

华为企业数字化运维运营体系建设综合解决方案:运维运营体系架构、统一运维运营平台、多云管理与集成、组织设计与流程架构

本文是华为企业数字化运维运营体系建设的综合解决方案,主要围绕企业数字化转型中的运维与运营两大核心环节展开,提出了一套系统化的建设方案。旨在通过标准化、自助化、可视化、智能化的手段,提升企业运维运营的效率和质量,推动企…...

计算机毕业设计Python+PySpark+DeepSeek-R1大模型B站弹幕评论情感分析 视频情感分析 视频推荐系统 视频数据可视化大屏 大数据毕设

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 技术范围:Sprin…...

从0到1复刻“龙虾员工”:用OpenClaw+百度DuClaw在1天内搭建可报销的AI助理

文章目录一、先别急着"养虾",搞清楚这只"小龙虾"到底能干啥二、DuClaw不是"阉割版",而是"外卖版"三、实战:用1天养一只"报销助理"3.1 注册与环境准备3.2 让AI学会"看发票"3.3 接…...

小厂逆袭:用项目堆出大厂Offer--关于不同的企业不同的面试重点以及侧重点和技巧

三重警告!小厂突围秘籍:放弃形式主义,用项目堆出大厂Offer! 形式是枷锁,项目是王道。当你还在纠结流程规范时,聪明人早已用实战经验敲开了大厂的门。 第一重警告:别把精力浪费在无谓的形式上&am…...

TCP的核心参数-MTU、MSS、RTT、RTO、cwnd、ssthresh

MTU和MSS,管【单个TCP包到底发多大最合适】,是整个传输的基础; RTT和RTO,管【包发出去之后,怎么保证对方一定收到,丢包了怎么办】,是TCP可靠传输的核心; cwnd和ssthresh,管【一次能连续发多少个包,怎么既跑满带宽,又不把网络堵死】,是TCP拥塞控制的核心。 MTU &…...

书匠策AI:论文写作界的“魔法棒”,期刊发表轻松搞定!

在学术的征途中,每一位研究者都梦想着将自己的智慧结晶——论文,发表在权威的期刊上,让世界看到自己的研究成果。然而,论文写作的道路并非一帆风顺,从选题到成稿,每一步都充满了挑战。但别担心,…...

vlm 当前图纸是否符合标注要求,如果不符合,请给出修改步骤;

根据您提供的图纸内容和标注要求,我们来逐条分析当前图纸是否符合规范,并提出修改建议。✅ 一、标注要求逐项检查与修改建议1. 直径用转折线(直径符号 应使用“转折线”标注)现状:图中直径标注如 10 -0.05 和 10 -0.0…...

基于微信小程序的大学生社会实践平台[小程序]-计算机毕业设计源码+LW文档

摘要:大学生社会实践是高校人才培养的重要环节,对于提升学生的综合素质、增强社会适应能力具有重要意义。本文设计并实现了一个基于微信小程序的大学生社会实践平台,该平台涵盖系统用户管理、公告信息管理、变幻图设置、教师管理、学生管理、…...

基于微信小程序的大学生志愿银行管理系统[小程序]-计算机毕业设计源码+LW文档

摘要:大学生志愿银行作为一种创新性的志愿服务管理模式,对于激励大学生参与志愿服务、量化志愿服务成果具有重要意义。本文设计并实现了一个基于微信小程序的大学生志愿银行管理系统,该系统涵盖系统用户管理、新闻数据管理、变幻图设置、项目…...

基于微信小程序的大学生租房平台[小程序]-计算机毕业设计源码+LW文档

摘要:随着高校学生数量的增加,大学生租房需求日益增长。为解决大学生租房过程中信息不对称、流程繁琐等问题,本文设计并实现了一个基于微信小程序的大学生租房平台。该平台涵盖系统用户管理、新闻数据管理、房源管理、预约看房管理、合同管理…...

基于微信小程序的代炒菜系统[小程序]-计算机毕业设计源码+LW文档

摘要:随着移动互联网的迅速发展和人们生活节奏的加快,代炒菜服务作为一种新兴的餐饮模式逐渐兴起。本文设计并实现了一个基于微信小程序的代炒菜系统,旨在为用户提供便捷的代炒菜服务预订平台,同时为商家提供高效的管理工具。该系…...

基于微信小程序的电动自行车充电管理系统[小程序]-计算机毕业设计源码+LW文档

摘要:随着电动自行车的普及,其充电管理问题日益受到关注。微信小程序凭借其便捷性、易传播性成为实现电动自行车充电管理的有效平台。本文设计并实现了一个基于微信小程序的电动自行车充电管理系统,涵盖变幻图设置、充电桩管理、电动车站点管…...

【开题答辩全过程】以 高校学生就业管理系统 为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

电镀生产线与酸洗纯化干燥线:西门子博途PLC程序探秘

电镀生产线西门子博途PLC程序 酸洗纯化干燥线在工业制造领域,电镀生产线以及酸洗纯化干燥线都扮演着极为关键的角色。而西门子博途(TIA Portal)平台,为这些生产线的自动化控制提供了强大的编程支持。今天咱们就来唠唠这其中的门道…...

AI Agent接口之争,MCP黯然退场,终端为何成终局答案

2024年11月,Anthropic推出MCP协议,喊出“AI世界的USB-C”口号,试图统一大模型与外部工具的连接标准,初期引爆AI社区,GitHub上数千个MCP Server应声而出。但仅一年多后,估值180亿美元的Perplexity宣布放弃MC…...

计算机毕业设计源码:Python旅游景点个性化推荐平台 Django框架 协同过滤推荐算法 可视化 数据分析 旅游 旅行 出行 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

AI编程助手Claude Code、Codex、OpenCode一站式Docker环境

AI编程助手Claude Code、Codex、OpenCode一站式Docker环境 一、为什么要搭建这样一个环境?1.1 背景与动机1.2 你能得到什么 二、相关截图二、整体架构与核心概念三、准备工作(是什么 & 为什么)3.1 基础环境3.2 可选:Ollama服务…...

解锁学术新秘籍:书匠策AI,期刊论文的智慧导航者

在学术的浩瀚海洋中,每一位探索者都渴望拥有一盏明灯,照亮前行的道路,让复杂的论文写作变得轻松而高效。今天,就让我带你走进一个全新的学术世界——书匠策AI,一个专为期刊论文写作量身打造的智能助手,它正…...

解锁论文写作新境界:书匠策AI,你的期刊论文智能导航员

在学术的浩瀚海洋中,每一位研究者都像是勇敢的航海家,而期刊论文则是他们探索未知、分享发现的重要航标。然而,撰写一篇高质量的期刊论文并非易事,它要求研究者不仅具备深厚的专业知识,还需掌握一定的写作技巧与规范。…...

横评后发现!8个降AIGC工具全场景通用测评,哪款最能帮你降AI率?

在当前学术写作和内容创作领域,AI生成内容(AIGC)的普及带来了前所未有的便利,但也让“去AI痕迹”和“降低查重率”成为许多创作者必须面对的挑战。无论是学生、研究人员还是内容创作者,都希望自己的作品既保持原创性&a…...

研究生收藏!巅峰之作的降AIGC工具 —— 千笔AI

在AI技术迅猛发展的今天,越来越多的研究生和本科生开始依赖AI工具进行论文写作,以提高效率、优化内容结构。然而,随之而来的“AI率超标”问题却成为学术道路上的一大难题。随着知网、Turnitin等查重系统的算法不断升级,AI生成内容…...

计算机毕业设计源码:Python旅游数据智能推荐分析系统 Django框架 协同过滤推荐算法 可视化 数据分析 旅游 旅行 出行 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

浏览器拓展通用安装方法 edge浏览器、谷歌浏览器、google浏览器、火狐浏览器

浏览器拓展通用安装教程 浏览器扩展安装简明教程 1、访问GitHub项目页面, 2、下载扩展文件 3、在Chrome/Edge浏览器中: 打开扩展管理页面 启用"开发者模式" 4、点击"加载已解压的扩展程序" 选择下载的扩展文件夹 5、安装完成后即可…...

从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程

从零开始搭建Kubernetes集群 从零开始搭建Kubernetes (K8s) 集群 部署方式准备工作(所有节点) 1. 关闭防火墙2. 关闭 SELinux3. 关闭 Swap 分区4. 设置主机名5. 配置网络设置6. 安装 IPVS(可选,非必须) 安装 Docker、…...

计算机毕业设计源码:Python旅游协同过滤推荐可视化平台 Django框架 协同过滤推荐算法 可视化 数据分析 旅游 旅行 出行 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

保姆级教程:用Ollama快速部署Yi-Coder-1.5B代码生成模型

保姆级教程:用Ollama快速部署Yi-Coder-1.5B代码生成模型 1. 引言 作为一名开发者,你是否经常遇到这样的场景:面对一个复杂功能时,脑海中已经有了大致思路,却卡在具体实现细节上?或者需要快速验证某个算法…...