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

LeetCode 238. 除自身以外数组的乘积:前缀积与后缀积

题目说明

给定整数数组 nums,返回数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余元素的乘积。

要求:

  • 时间复杂度为 O(n)
  • 不能使用除法;
  • 进阶要求除输出数组外只使用 O(1) 额外空间。

例如:

输入:nums = [1,2,3,4]
输出:[24,12,8,6]

思路:答案等于左侧乘积乘右侧乘积

对于每个位置 i,把除自身以外的元素拆成左右两部分:

answer[i] = nums[0] * ... * nums[i-1] * nums[i+1] * ... * nums[n-1]

也就是:

answer[i] = 左侧所有元素的乘积 * 右侧所有元素的乘积

第一次从左向右遍历,让 answer[i] 保存 nums[i] 左侧所有元素的乘积。第二次从右向左遍历,用变量 right 累积右侧乘积,并将它乘进 answer[i]

[1,2,3,4] 为例:

左侧前缀积写入 answer:[1,1,2,6]
从右向左累乘后缀积:[24,12,8,6]

answer[0] 左侧没有元素,空乘积记为 1;最后一个元素右侧同理。

Python 代码

class Solution:def productExceptSelf(self, nums: list[int]) -> list[int]:n = len(nums)answer = [1] * nleft = 1for i in range(n):answer[i] = leftleft *= nums[i]right = 1for i in range(n - 1, -1, -1):answer[i] *= rightright *= nums[i]return answer

还可以省去单独的 left 变量,直接利用已经写入的答案数组:

class Solution:def productExceptSelf(self, nums: list[int]) -> list[int]:n = len(nums)answer = [1] * nfor i in range(1, n):answer[i] = answer[i - 1] * nums[i - 1]right = 1for i in range(n - 1, -1, -1):answer[i] *= rightright *= nums[i]return answer

正确性说明

第一次遍历结束后,answer[i] 等于 nums[i] 左侧全部元素的乘积。第二次遍历到位置 i 时,变量 right 等于 nums[i] 右侧全部元素的乘积。二者相乘后,answer[i] 正好包含除 nums[i] 以外的所有元素,因此算法得到正确答案。

为什么不使用除法

直接计算数组总乘积再除以当前元素,不仅违反题目要求,还需要额外处理零:

  • 一个零时,只有零所在位置可能得到非零答案;
  • 两个及以上零时,所有答案都是零。

前缀积与后缀积不依赖除法,因此不需要针对零编写特殊分支,负数也能自然处理。

复杂度分析

  • 时间复杂度:O(n)。数组被线性遍历两次。
  • 空间复杂度:O(1) 额外空间。返回数组不计入额外空间时,只使用常数个变量。

易错点

  1. answer 的初始值必须是 1,不能是 0
  2. 更新 right 的顺序不能颠倒:先执行 answer[i] *= right,再执行 right *= nums[i],否则会把当前元素乘入答案。
  3. 不需要单独处理零。
  4. 不要把两个完整的前缀积、后缀积数组都保留下来,否则额外空间会变成 O(n)

面试表达

先写出关系“当前位置答案 = 左侧乘积 × 右侧乘积”,再说明输出数组可复用为前缀积数组,后缀积只需一个滚动变量。这样能够同时满足 O(n) 时间、禁用除法和常数额外空间三个要求。

http://www.jsqmd.com/news/1330005/

相关文章:

  • Godot游戏开发调试与性能优化全攻略:从工具使用到底层原理
  • 正则表达式——匹配一组字符
  • 基于DeepSeek构建AI Agent:从ReAct模式到LangGraph工程化实践
  • 负反馈环路稳定性分析:破环测量与补偿设计实战指南
  • 找邯郸轻质隔墙板公司哪家好,这几项硬指标你得先摸清 - 热点品牌推荐
  • 重庆智能芯片餐具生产商有哪些?业内经验全分享 - 热点品牌推荐
  • TTL 和 RS232 到底有什么区别?一句话:表示 0 和 1 的电压不一样
  • 高频DC-DC电源设计:DGD0506门极驱动IC实战解析与PCB布局避坑指南
  • 晋江承接全屋整装装修公司选型与环保板材方案 - 热点品牌推荐
  • Windows Server 2012存储池高级管理:性能调优、维护与故障排查实战
  • 2026 年 8 月新发布:革吉值得关注的建筑基坑防护栏制造厂家联系方式,工地边那圈不起眼的铁家伙,竟是防止事故的关键防线?-耀邦丝网 - 行业推荐官-2
  • 7步掌握PlayCover:在Apple Silicon Mac上完美运行iOS应用和游戏
  • 佛山公司搬家收费明细:搬家公司联系电话、搬迁吉日挑选、现场作业避坑测评实用手册 - 厚道搬家
  • 2026年永康非标门厂家对比怎么选更稳妥 - 热点品牌推荐
  • MetaGPT | 第五章:开发实践
  • 抖音小店密文代发完整设置教程,零基础配置 - 电商分享
  • Avogadro 2:化学分子可视化的终极解决方案,让复杂结构变得简单直观
  • 正则表达式——重复匹配
  • 北京专业的it软件人员商哪家靠谱?实战选型指南 - 热点品牌推荐
  • Video2X深度解析:基于机器学习的视频超分辨率与帧插值实战指南
  • 图像颜色色域全解析:从sRGB到Rec.2020,掌握色彩管理核心
  • 租电脑哪家性价比高:【雕马】划算实惠 - 17328623207
  • #泉州市政管网改造怎么挑PE钢丝骨架复合管制造厂? - 热点品牌推荐
  • 2026 年现阶段银川诚信的防渗膜实力厂家哪家好,旧鱼塘翻修忘加这层,半年后池底裂得漏光水,这玩意儿到底是啥?-梦想工程材料 - 鉴选官
  • Unity 3D动作手游战斗系统开发:从状态机到伤害判定的核心实现
  • 2026 年更新:景德镇值得关注的35#精密光亮管厂商哪家好,装修选材别乱选,这玩意儿为啥能让师傅连说三个好?-赫凤钢管 - 行业严选官
  • NS-USBloader:Switch玩家的终极一站式游戏管理解决方案
  • STM32开发必备:ST-LINK V2下载调试全攻略与疑难排查
  • 抖音小店电子面单怎么开通使用?发货打单教程 - 电商分享
  • 泉州刑事案件律师哪家正规?找对口团队更稳妥 - 热点品牌推荐