LeetCode Hot100刷题——除自身以外数组的乘积

news2025/5/19 13:42:41

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

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

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

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 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 <= 105
  • -30 <= nums[i] <= 30
  • 输入 保证 数组 answer[i] 在  32 位 整数范围内

思路分析

如果用除法的话,可以先算所有数的乘积,然后每个位置除以自己。但题目中不允许使用除法,我想到的另一个方法是前缀和后缀的乘积。比如,对于每个元素 i 来说,左边所有元素的乘积乘上右边所有元素的乘积,就是结果。那这样,先从左到右计算每个元素的左边乘积,存到一个数组里,然后从右到左计算右边乘积,再乘到对应的左边乘积上,得到最终结果。

具体步骤

  1. 初始化一个answer数组,长度和nums一样。
  2. 计算左边的乘积,从左到右遍历。首先answer[0] = 1,然后后面的每个元素 i ,answer[i] = answer[i-1] * nums[i-1]。这样answer数组此时保存的是每个元素的左边乘积。
  3. 然后计算右边的乘积,用一个变量rightProduct来保存右边的累积,初始化为1。
  4. 从右往左遍历,每次将answer[i]乘以rightProduct,然后更新rightProduct *= nums[i]。这样,在遍历过程中answer[i] = left[i] * rightProduct。其中rightProduct是右边所有元素的乘积。

这样的话,整个过程是两次遍历

        首先初始化answer数组。第一个循环,从左到右填充左边乘积。然后第二个循环,从右到左,用rightProduct变量来乘。具体步骤:

        初始化answer数组,长度为nums.length。answer[0] = 1。然后对于i从1到nums.length-1,answer[i] = answer[i-1] * nums[i-1]。

        然后初始化rightProduct为1。然后从i=nums.length-1到0,循环。每次将answer[i]乘以rightProduct,然后rightProduct *= nums[i]。

程序代码

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] answer = new int[n];
        answer[0] = 1;
        // 计算每个元素的左边乘积
        for(int i = 1; i < n; i++){
            answer[i] = answer[i - 1] * nums[i - 1];
        }

        // 计算右边乘积并乘以左边乘积
        int rightProduct = 1;
        for(int i = n - 1; i >= 0; i--){
            answer[i] *= rightProduct;
            rightProduct *= nums[i];
        }
        return answer;
    }
}
  1. 步骤分解

    • 前缀乘积计算:从左到右遍历数组,answer[i]存储nums[i]左边所有元素的乘积。

    • 后缀乘积整合:从右到左遍历数组,使用变量rightProduct动态维护当前元素右边的乘积,并直接将其乘到answer[i]上。

  2. 复杂度:两次遍历,时间复杂度O(n);结果数组外额外空间O(1),满足题目要求。

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

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

相关文章

JAVA EE(进阶)_进阶的开端

别放弃浸透泪水的昨天&#xff0c;晨光已为明天掀开新篇 ——陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE_HTTP-CSDN博客 1.什么是Java EE Java EE&#xff08;Java Pla…

ArcGIS Pro调用多期历史影像

一、访问World Imagery Wayback&#xff0c;基本在我国范围 如下图&#xff1a; 二、 放大到您感兴趣的区域 三、 查看影像版本信息 点击第二步的按钮后&#xff0c;便可跳转至World Imagery (Wayback 2025-04-24)的相关信息。 四 、点击上图影像版本信息&#xff0c;页面跳转…

组态王|组态王中如何添加西门子1200设备

哈喽,你好啊,我是雷工! 最近使用组态王采集设备数据,设备的控制器为西门子的1214CPU, 这里边实施边记录,以下为在组态王中添加西门子1200PLC的笔记。 1、新建 在组态王工程浏览器中选择【设备】→点击【新建】。 2、选择设备 和设备建立通讯要通过对应的设备驱动。 在…

6.2.2邻接表法-图的存储

知识总览&#xff1a; 为什么要用邻接表 因为邻接矩阵的空间复杂度高(O(n))&#xff0c;且不适合边少的稀疏图&#xff0c;所以有了邻接表 用代码表示顶点、图 声明顶点图信息 声明顶点用一维数组存储各个顶点的信息&#xff0c;一维数组字段包括2个&#xff0c;每个顶点的…

C++23 放宽范围适配器以允许仅移动类型(P2494R2)

文章目录 引言背景与动机提案内容与实现细节提案 P2494R2实现细节编译器支持 对开发者的影响提高灵活性简化代码向后兼容性 示例代码总结 引言 C23 标准中引入了许多重要的改进&#xff0c;其中一项值得关注的特性是放宽范围适配器&#xff08;range adaptors&#xff09;以允…

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer spring-kafka官方文档: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframe…

WebRTC技术下的EasyRTC音视频实时通话SDK,助力车载通信打造安全高效的智能出行体验

一、方案背景​ 随着智能交通与车联网技术的飞速发展&#xff0c;车载通信在提升行车安全、优化驾驶体验以及实现智能交通管理等方面发挥着越来越重要的作用。传统的车载通信方式在实时性、稳定性以及多媒体交互能力上存在一定局限&#xff0c;难以满足现代车载场景日益复杂的…

数据科学和机器学习的“看家兵器”——pandas模块 之二

目录 pandas 模块介绍 4.2 pandas 数据读取 4.2.1 课程目标 4.2.2 读取 Excel 文件中的数据 (一)读取某个工作表中的数据 (二)读取指定数据列的标签内容 (三)读取指定数据行的标签内容 (四)读取指定行或者列 4.2.3、读取 CSV 文件数据 4.2.4、课程总结回顾 4.2.5、课后…

MySQL--day2--基本的select语句

&#xff08;以下内容全部来自上述课程&#xff09; SQL概述 结构化查询语句 1. SQL分类 DDL&#xff1a;数据定义&#xff08;definition&#xff09;语言&#xff1a;create、drop、alter… DML&#xff1a;数据操作&#xff08;manipulation&#xff09;语言&#xff…

自动化:批量文件重命名

自动化&#xff1a;批量文件重命名 1、前言 2、效果图 3、源码 一、前言 今天来分享一款好玩的自动化脚&#xff1a;批量文件重命名 有时候呢&#xff0c;你的文件被下载下来文件名都是乱七八糟毫无规律&#xff0c;但是当时你下载的时候没办法重名或者你又不想另存为重新重…

学习!FastAPI

目录 FastAPI简介快速开始安装FastApiFastAPI CLI自动化文档 Reqeust路径参数Enum 类用于路径参数路径参数和数值校验 查询参数查询参数和字符串校验 请求体多个请求体参数嵌入单个请求体参数 CookieHeader表单文件直接使用请求 ResponseResponse Model多个关联模型 响应状态码…

【第三十六周】LoRA 微调方法

LoRA 摘要Abstract文章信息引言方法LoRA的原理LoRA在Transformer中的应用补充其他细节 实验与分析LoRA的使用论文实验结果分析 总结 摘要 本篇博客介绍了LoRA&#xff08;Low-Rank Adaptation&#xff09;&#xff0c;这是一种面向大规模预训练语言模型的参数高效微调方法&…

Redis 数据类型与操作完全指南

Redis 是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同&#xff0c;Redis 提供了丰富的数据类型和灵活的操作方式&#xff0c;这使得它能够高效地解决各种不同场景下的数据存储和处理问题。本文将全面介绍 R…

Digi XBee XR 系列介绍

Digi 延续了 20 多年来亚 GHz 射频模块的传统&#xff0c;推出了 Digi XBee XR 系列远距离模块&#xff0c;包括 Digi XBee XR 900 - 已通过多个地区的预先认证 - 以及 Digi XBee XR 868 - 已通过欧洲地区应用的预先认证。 这些先进的射频模块专为远距离抗干扰无线通信而设计。…

【方法论】金字塔原理概述:写作逻辑的底层架构与实践法则

文章目录 一、为何采用金字塔结构&#xff1a;对抗认知局限的思维框架1、 梳理逻辑&#xff0c;抽象归纳2、自上而下&#xff0c;结论居首3、 结论先行之必要 三、金字塔结构1、纵向逻辑&#xff1a;上层思想必须是下层思想的概括提炼2、横向逻辑&#xff1a;每组思想需属于同一…

BERT 核心技术全解析:Transformer 双向编码与掩码语言建模的底层逻辑

一、引言&#xff1a;从 BERT 到生成式 AI 的进化之路 科学的突破从来不是孤立的奇迹&#xff0c;而是人类知识长河中无数基石的累积。 当我们惊叹于 ChatGPT、Google Bard 等大型语言模型&#xff08;LLM&#xff09;在生成式 AI 领域的惊人表现时&#xff0c;不能不回溯到 20…

【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理

目录 一、图像几何变化 1、对图片进行放大、缩小、水平放大和垂直放大 2、旋转、缩放、控制画布大小 二、图像形态学处理 1、梯度运算 2、闭运算 3、礼帽运算 4、黑帽运算 三、图像阈值分割 1、二值化处理 2、反二值化处理 3、截断阈值处理 4、超阈值零处理 5、低…

CSS- 4.4 固定定位(fixed) 咖啡售卖官网实例

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…

得力标签打印机系统集成方案的技术应用与场景实践

一、方案背景与技术特性 在物联网设备管理场景中&#xff0c;标签打印的自动化与效率提升成为企业数字化升级的重要需求。得力标签打印机驱动及系统集成方案&#xff0c;通过技术接口开发与硬件协同&#xff0c;为设备标识管理提供 轻量化对接能力。以下从技术适配性与功能设计…

【通用智能体】Playwright:跨浏览器自动化工具

Playwright&#xff1a;跨浏览器自动化工具 一、Playwright 是什么&#xff1f;二、应用场景及案例场景 1&#xff1a;端到端&#xff08;E2E&#xff09;测试场景 2&#xff1a;UI 自动化&#xff08;表单批量提交&#xff09;场景 3&#xff1a;页面截图与 PDF 生成场景 4&am…