news 2026/4/23 12:20:44

【每日算法】LeetCode238. 除自身以外数组的乘积

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日算法】LeetCode238. 除自身以外数组的乘积

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode238. 除自身以外数组的乘积

1. 题目描述

给定一个整数数组nums,返回一个数组answer,使得answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目要求:

  • 不能使用除法。
  • 时间复杂度为 O(n)。
  • 空间复杂度为 O(1)(不计算输出数组的空间)。

进阶:你可以在 O(1) 额外空间复杂度内完成这个题目吗?(出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

示例:

  • 输入: nums = [1,2,3,4]
  • 输出: [24,12,8,6]
  • 解释: answer[0] = 234=24, answer[1] = 134=12, 以此类推。

2. 问题分析

这个问题要求计算数组中每个元素除自身外所有其他元素的乘积。直接思路包括:

  • 使用除法:先计算总乘积,然后除以每个元素。但题目禁止使用除法,且如果数组中有零元素,会导致除零错误或结果不准确。
  • 暴力计算:对于每个元素,遍历数组计算乘积,但时间复杂度为 O(n²),不满足要求。
    因此,需要一种高效算法,在 O(n) 时间内完成,且空间开销最小。核心是避免重复计算,利用前缀和后缀乘积的思想。

3. 解题思路

3.1 思路一:暴力法(不推荐)

对于每个索引 i,遍历数组计算除 nums[i] 外所有元素的乘积。时间复杂度 O(n²),空间 O(1)(输出数组除外)。不满足题目要求,仅用于理解问题。

3.2 思路二:左右乘积列表

维护两个数组:

  • left[i]表示 nums[0] 到 nums[i-1] 的乘积(即 i 左侧所有元素的乘积)。
  • right[i]表示 nums[i+1] 到 nums[n-1] 的乘积(即 i 右侧所有元素的乘积)。
    然后,answer[i] = left[i] * right[i]。这通过两次遍历实现:一次从左到右计算左乘积,一次从右到左计算右乘积。时间复杂度 O(n),空间 O(n)(用于存储左右乘积列表)。

3.3 思路三:空间优化版左右乘积(最优解)

在思路二的基础上进行空间优化:

  1. 使用输出数组answer先存储左乘积(即answer[i]初始为左侧所有元素的乘积)。
  2. 然后从右向左遍历,用一个变量rightProduct累积右侧元素的乘积,并乘以answer[i]得到最终结果。
    这样,时间复杂度 O(n),空间复杂度 O(1)(忽略输出数组),满足进阶要求。这是最优解,因为它平衡了时间和空间效率。

4. 各思路代码实现

4.1 思路一代码实现(暴力法)

functionproductExceptSelf(nums){constn=nums.length;constanswer=newArray(n).fill(1);for(leti=0;i<n;i++){for(letj=0;j<n;j++){if(i!==j){answer[i]*=nums[j];}}}returnanswer;}

4.2 思路二代码实现(左右乘积列表)

functionproductExceptSelf(nums){constn=nums.length;constleft=newArray(n).fill(1);constright=newArray(n).fill(1);constanswer=newArray(n);// 计算左乘积for(leti=1;i<n;i++){left[i]=left[i-1]*nums[i-1];}// 计算右乘积for(leti=n-2;i>=0;i--){right[i]=right[i+1]*nums[i+1];}// 计算答案for(leti=0;i<n;i++){answer[i]=left[i]*right[i];}returnanswer;}

4.3 思路三代码实现(空间优化版)

functionproductExceptSelf(nums){constn=nums.length;constanswer=newArray(n).fill(1);// 第一步:计算左乘积并存入 answerletleftProduct=1;for(leti=0;i<n;i++){answer[i]=leftProduct;leftProduct*=nums[i];}// 第二步:从右向左遍历,乘上右乘积letrightProduct=1;for(leti=n-1;i>=0;i--){answer[i]*=rightProduct;rightProduct*=nums[i];}returnanswer;}

5. 各实现思路的复杂度、优缺点对比表格

思路时间复杂度空间复杂度(除输出外)优点缺点是否满足题目要求
暴力法O(n²)O(1)简单直观,易于实现效率极低,不适用于大数据集
左右乘积列表O(n)O(n)高效,逻辑清晰,易于理解和调试使用额外 O(n) 空间,未优化空间是(时间满足,空间未优化)
空间优化版O(n)O(1)时间和空间最优,满足进阶要求代码稍复杂,需注意遍历顺序是(最优解)

6. 总结

6.1 关键点回顾

  • 核心思想:利用前缀和后缀乘积避免重复计算,将问题分解为左右两部分。
  • 最优解:空间优化版左右乘积,通过两次遍历实现 O(n) 时间和 O(1) 空间。
  • 前端关联:在前端开发中,这种算法思想可用于状态管理、数据转换等场景,例如计算累积值或处理数组映射。

6.2 实际应用场景

  1. 前端数据处理:在表格或图表中,需要计算每个数据点相对于其他点的聚合值(如乘积、比率),例如在数据可视化库中处理归一化数据。
  2. 状态管理:在 React 或 Vue 中,当派生状态依赖于其他状态时,类似算法可高效计算衍生值,避免不必要的重渲染。
  3. 图像处理:在前端 canvas 或 WebGL 中,应用滤镜效果时,可能需要计算像素周围区域的累积值,这种前缀积思想可以优化性能。
  4. 性能优化:在处理大型数组时(如日志分析、用户行为数据),高效算法能提升响应速度,增强用户体验。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 7:26:57

【紧急通知】Open-AutoGLM全国服务网点锐减:如何在48小时内成功预约?

第一章&#xff1a;Open-AutoGLM 维修服务预约Open-AutoGLM 是一款基于大语言模型驱动的智能汽车维修服务平台&#xff0c;专为车主提供高效、精准的维修预约服务。系统通过自然语言理解技术解析用户需求&#xff0c;自动匹配最近的维修站点并完成预约流程。服务接入方式 平台支…

作者头像 李华
网站建设 2026/4/23 10:49:46

如何在72小时内完成Open-AutoGLM对接上线?一线工程师亲述避坑指南

第一章&#xff1a;Open-AutoGLM美甲服务预约项目概述Open-AutoGLM 是一个基于大语言模型驱动的智能美甲服务预约系统&#xff0c;旨在通过自然语言交互实现高效、个性化的用户服务体验。系统融合了对话理解、意图识别与自动化排程技术&#xff0c;使用户可通过语音或文本方式完…

作者头像 李华
网站建设 2026/4/23 12:19:05

【独家揭秘】头部娱乐集团为何选择Open-AutoGLM作为核心预订引擎?

第一章&#xff1a;Open-AutoGLM KTV 预订引擎的崛起背景随着智能服务与自然语言处理技术的深度融合&#xff0c;传统娱乐行业的数字化转型迎来了关键突破。KTV 作为大众休闲消费的重要场景&#xff0c;长期受限于人工预订效率低、系统响应慢、用户体验割裂等问题。Open-AutoGL…

作者头像 李华
网站建设 2026/4/23 12:16:26

FCKEditor支持Word图片转存保留原尺寸和分辨率

吉林码农的"文档导入插件大冒险"&#xff1a;从FCKEditor到全能粘贴王的逆袭之路 第一章&#xff1a;客户爸爸的"核弹级"需求 "老王啊&#xff0c;我们新闻编辑器要加个功能&#xff0c;能直接导入Word/Excel/PPT/PDF&#xff0c;还要保留所有样式和公…

作者头像 李华
网站建设 2026/4/16 3:05:05

手把手教你部署Open-AutoGLM(从环境配置到高并发应对完整流程)

第一章&#xff1a;Open-AutoGLM 理发预约安排在智能服务调度系统中&#xff0c;Open-AutoGLM 作为一种基于生成式语言模型的自动化决策引擎&#xff0c;能够高效处理复杂的预约场景。以理发店预约为例&#xff0c;系统需综合考虑发型师空闲时段、客户需求偏好以及服务时长等因…

作者头像 李华
网站建设 2026/4/23 10:48:42

掌握这4种调优技巧,让你的 Open-AutoGLM 查询准确率突破95%

第一章&#xff1a;Open-AutoGLM 电影场次查询准确率提升的背景与意义随着智能对话系统在文娱领域的广泛应用&#xff0c;用户对自然语言理解系统的语义解析能力提出了更高要求。特别是在电影票务场景中&#xff0c;用户频繁通过语音或文本查询特定影片的放映时间、影院分布及余…

作者头像 李华