LeetCode 热题 100 238. 除自身以外数组的乘积

LeetCode 热题 100 | 238. 除自身以外数组的乘积

大家好,今天我们来解决一道经典的算法问题——除自身以外数组的乘积。这道题在 LeetCode 上被标记为中等难度,要求在不使用除法的情况下,计算数组中每个元素的乘积,其中每个元素的值是数组中除自身以外其余各元素的乘积。


问题描述

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

题目数据保证数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内。

示例 1:

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

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

提示:

  • 2 <= nums.length <= 10^5
  • -30 <= nums[i] <= 30
  • 输入保证数组 answer[i] 在 32 位整数范围内

解题思路

核心思想
  1. 前缀和后缀乘积

    • 使用两个数组 leftright 分别存储每个位置的前缀乘积和后缀乘积。
    • left[i] 表示从数组开头到位置 i-1 的所有元素的乘积。
    • right[i] 表示从位置 i+1 到数组末尾的所有元素的乘积。
    • 最终结果 answer[i]left[i] * right[i]
  2. 优化空间复杂度

    • 可以直接在结果数组 answer 中计算前缀乘积,然后从后向前计算后缀乘积,从而避免使用额外的数组。

Python代码实现

class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:n = len(nums)answer = [1] * n# 计算前缀乘积left_product = 1for i in range(n):answer[i] = left_productleft_product *= nums[i]# 计算后缀乘积并更新结果right_product = 1for i in range(n - 1, -1, -1):answer[i] *= right_productright_product *= nums[i]return answer

代码解析

  1. 初始化

    • answer 数组初始化为长度为 n 的列表,所有值初始化为 1。
  2. 计算前缀乘积

    • 使用变量 left_product 记录当前元素之前的乘积。
    • 遍历数组,更新 answer[i]left_product,然后更新 left_product
  3. 计算后缀乘积并更新结果

    • 使用变量 right_product 记录当前元素之后的乘积。
    • 从后向前遍历数组,更新 answer[i]answer[i] * right_product,然后更新 right_product
  4. 返回结果

    • 最终结果存储在 answer 中。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。只需要两次遍历数组。
  • 空间复杂度:O(1),直接在结果数组 answer 中计算,不使用额外的数组。

示例运行

示例 1
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

总结

通过前缀和后缀乘积的方法,我们可以高效地解决除自身以外数组的乘积问题。这种方法在 O(n) 时间复杂度内完成,并且只使用了常数级别的额外空间。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络编程】三、TCP网络套接字编程

文章目录 TCP通信流程Ⅰ. 服务器日志类实现Ⅱ. TCP服务端1、服务器创建流程2、创建套接字 -- socket3、绑定服务器 -- bind&#x1f38f;4、服务器监听 -- listen&#x1f38f;5、获取客户端连接请求 -- acceptaccept函数返回的套接字描述符是什么&#xff0c;不是已经有一个了…

STM32的SysTick

SysTick介绍 定义&#xff1a;Systick&#xff0c;即滴答定时器&#xff0c;是内核中的一个特殊定时器&#xff0c;用于提供系统级的定时服务。该定时器是一个24位的递减计数器&#xff0c;具有自动重载值寄存器的功能。当计数器到达自动重载值时&#xff0c;它会自动重新加载…

【Java项目脚手架系列】第一篇:Maven基础项目脚手架

【Java项目脚手架系列】第一篇:Maven基础项目脚手架 前言 在Java开发中,一个好的项目脚手架可以大大提高开发效率,减少重复工作。本系列文章将介绍各种常用的Java项目脚手架,帮助开发者快速搭建项目。今天,我们先从最基础的Maven项目脚手架开始。 什么是项目脚手架? …

Kafka的消息保留策略是怎样的? (基于时间log.retention.hours或大小log.retention.bytes,可配置删除或压缩策略)

Kafka 消息保留策略详解 1. 核心保留机制 # Broker 基础配置示例&#xff08;server.properties&#xff09; log.retention.hours168 # 默认7天保留时间 log.retention.bytes1073741824 # 1GB 大小限制2. 策略类型对比 策略类型配置参数执行逻辑适用场景时间删除log.re…

五一の自言自语 2025/5/5

今天开学了&#xff0c;感觉还没玩够。 假期做了很多事&#xff0c;弄了好几天的路由器、监控、录像机&#xff0c;然后不停的出现问题&#xff0c;然后问ai&#xff0c;然后解决问题。这次假期的实践&#xff0c;更像是计算机网络的实验&#xff0c;把那些交换机&#xff0c;…

安卓基础(静态方法)

静态方法的特点​​ ​​无需实例化​​&#xff1a;直接用 类名.方法名() 调用。 ​​不能访问实例成员​​&#xff1a;只能访问类的静态变量或静态方法。 ​​内存中只有一份​​&#xff1a;随类加载而初始化&#xff0c;生命周期与类相同。 // 工具类 MathUtils publi…

EasyRTC嵌入式音视频通话SDK驱动智能硬件音视频应用新发展

一、引言 在数字化浪潮下&#xff0c;智能硬件蓬勃发展&#xff0c;从智能家居到工业物联网&#xff0c;深刻改变人们的生活与工作。音视频通讯作为智能硬件交互与协同的核心&#xff0c;重要性不言而喻。但嵌入式设备硬件资源受限&#xff0c;传统音视频方案集成困难。EasyRT…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》封面颜色空间一图的选图历程

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 学图像处理的都知道&#xff0c;彩色图像的颜色空间很多&#xff0c;而且又是三维&#xff0c;不同的角度有不同的视觉效果&#xff0c;MATLAB的图又有有box和没有box。…

Flutter 异步原理-Zone

前言 Zone 是 Dart 异步模型中的核心机制&#xff0c;主要用于&#xff1a; 隔离异步上下文&#xff0c;形成逻辑上的执行环境。捕获未处理的异步异常&#xff0c;保证系统稳定。自定义异步任务的调度行为&#xff08;比如微任务、Timer&#xff09;。 什么是 Zone&#xff1…

聊一聊自然语言处理在人工智能领域中的应用

目录 一、智能交互与对话系统 二、 信息提取与文本分析 三、机器翻译与跨语言应用 四、内容生成与创作辅助 五、 搜索与推荐系统 六、垂直领域的专业应用 七、关键技术支撑 自然语言处理NLP属于AI的一个子领域&#xff0c;专注于让机器理解和生成人类语言&#xff0c;比…

Redis的过期设置和策略

Redis设置过期时间主要有以下几个配置方式 expire key seconds 设置key在多少秒之后过期pexpire key milliseconds 设置key在多少毫秒之后过期expireat key timestamp 设置key在具体某个时间戳&#xff08;timestamp:时间戳 精确到秒&#xff09;过期pexpireat key millisecon…

vite:npm 安装 pdfjs-dist , PDF.js View 预览功能示例

pdfjs-dist 是 Mozilla 的 PDF.js 库的预构建版本&#xff0c;能让你在项目里展示 PDF 文件。下面为你介绍如何用 npm 安装 pdfjs-dist 并应用 pdf.js 和 pdf.worker.js。 为了方便&#xff0c;我将使用 vite 搭建一个原生 js 项目。 1.创建项目 npm create vitelatest pdf-v…

【Android】动画原理解析

一,基础动画 基础动画,有四种,分别是平移(Translate)、缩放(Scale)、Rorate(旋转)、Alpha(透明度),对应Android中以下四种。 1,Animation基类 1,基本概念 1,插值器 插值器的作用,是控制动画过程的参数,可以理解为 时间(t)与动画进程(d)的函数,动画仅…

手撕基于AMQP协议的简易消息队列-2(所用第三方库的介绍与简单使用)

第三方库的介绍 Protobuf 什么是Protobuf&#xff08;Protocol Buffer&#xff09;&#xff1f; Protobuf是数据结构序列化和反序列化框架 Protobuf的特点有哪些&#xff1f; 通用性&#xff1a;语⾔⽆关、平台⽆关。即 ProtoBuf ⽀持 Java、C、Python 等多种语⾔&#xf…

Altera系列FPGA实现图像视频采集转HDMI/LCD输出,提供4套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄像头输入Sensor之-->串口传图输入图像缓…

ABP vNext 集成 CAP + RabbitMQ 实现可靠事件总线

&#x1f680; ABP vNext 集成 CAP RabbitMQ 实现可靠事件总线 在分布式系统中&#xff0c;事件总线是实现服务解耦与最终一致性的核心手段。本文将以 ABP vNext 8.1 为基础&#xff0c;手把手教你如何集成 CAP RabbitMQ 构建可靠的事件驱动架构。 &#x1f3af; 本文适用于…

Linux 服务器静态 IP 配置初始化指南

✅ 第一步&#xff1a;确认网络管理方式 运行以下命令判断系统使用的网络管理服务&#xff1a; # 检查 NetworkManager 是否活跃 systemctl is-active NetworkManager# 检查 network&#xff08;旧服务&#xff09;是否活跃 systemctl is-active network或者检查配置路径&…

C++ 工具链与开发实践:构建安全、高效与创新的开发生态

引言 在 C 的技术演进中&#xff0c;工具链的革新与开发实践的迭代始终是推动语言生命力的核心动力。从内存安全的攻防体系到嵌入式设备的能效优化&#xff0c;从跨平台开发的降本增效到开发者社区的生态构建&#xff0c;C 正通过工具链与方法论的双重升级&#xff0c;应对复杂…

跨浏览器自动化测试的智能生成方法

一、背景与挑战&#xff1a;跨浏览器测试为什么“难”&#xff1f; 在现代Web应用开发中&#xff0c;跨浏览器兼容性是用户体验的底线保障。面对Chrome、Firefox、Safari、Edge乃至IE、移动浏览器等多种运行环境&#xff0c;开发者与测试人员常面临&#xff1a; 相同DOM在不同…

【Hive入门】Hive安全管理与权限控制:用户认证与权限管理深度解析

目录 引言 1 Hive安全管理体系概述 2 Hive用户认证机制 2.1 Kerberos集成认证 2.1.1 Kerberos基本原理 2.1.2 Hive集成Kerberos配置步骤 2.1.3 Kerberos认证常见问题排查 2.2 LDAP用户同步 2.2.1 LDAP协议概述 2.2.2 Hive集成LDAP配置 2.2.3 LDAP与Hive用户同步架构…