代码训练LeetCode(24)数组乘积

news2025/6/7 10:06:49

代码训练(24)LeetCode之数组乘积

Author: Once Day Date: 2025年6月5日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 238. 除自身以外数组的乘积 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(24)LeetCode之数组乘积
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

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

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

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

提示:

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

示例:

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

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
2. 分析

我们需要计算一个数组 answer,其中每个元素 answer[i] 是原数组 nums 中除了 nums[i] 之外所有元素的乘积。关键点是我们不能使用除法,并且需要在 O(n) 时间复杂度内解决,同时尽量减少额外空间的使用。

题目提供了一个数组 nums,要求我们为每一个元素计算出它所有其他元素的乘积。使用除法的话会非常直接,但题目要求我们不能使用除法,因此我们需要找到其他方法。由于每个元素的结果是其他元素的乘积,我们可以将问题分解为两部分的乘积:当前元素左侧的所有元素的乘积和右侧所有元素的乘积。

解题思路

  1. 构建左积数组 L,其中 L[i] 表示 nums[i] 左侧所有元素的乘积。
  2. 构建右积数组 R,其中 R[i] 表示 nums[i] 右侧所有元素的乘积。
  3. 计算结果数组 answer,其中 answer[i] = L[i] * R[i]

分析步骤

构建左积数组

  • 初始化 L[0] = 1(因为第一个元素左边没有元素)。
  • 从左到右遍历 nums,每个 L[i] = L[i - 1] * nums[i - 1]

构建右积数组

  • 初始化 R[n-1] = 1(因为最后一个元素右边没有元素)。
  • 从右到左遍历 nums,每个 R[i] = R[i + 1] * nums[i + 1]

计算结果数组

  • answer[i] = L[i] * R[i]

举例分析,以示例 nums = [1,2,3,4]

构建 L:

  • L[0] = 1
  • L[1] = 1 (L[0] * nums[0])
  • L[2] = 2 (L[1] * nums[1])
  • L[3] = 6 (L[2] * nums[2])

构建 R

  • R[3] = 1
  • R[2] = 4 (R[3] * nums[3])
  • R[1] = 12 (R[2] * nums[2])
  • R[0] = 24 (R[1] * nums[1])

结果 answer:

  • answer[0] = L[0] * R[0] = 1 * 24 = 24
  • answer[1] = L[1] * R[1] = 1 * 12 = 12
  • answer[2] = L[2] * R[2] = 2 * 4 = 8
  • answer[3] = L[3] * R[3] = 6 * 1 = 6

性能优化关键点

  • 时间复杂度:O(n)。我们只需要三次遍历整个数组。
  • 空间复杂度:可以优化到 O(1)(不包括输出数组)。我们可以直接在输出数组上构建 L,然后用一个变量来跟踪右边元素的乘积。
3. 代码实现
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    int i;
    *returnSize = numsSize;
    
    int *returnArray = malloc(numsSize * sizeof(int));
    // Build the answer array as left product array
    returnArray[0] = 1;
    for (i = 1; i < numsSize; i++) {
        returnArray[i] = returnArray[i - 1] * nums[i - 1];
    }
    
    // Modify the answer array by multiplying with right products
    int right = 1;
    for (i = numsSize - 1; i >= 0; i--) {
        returnArray[i] = returnArray[i] * right;
        right *= nums[i];
    }

    return returnArray;
}
4. 总结

这道题测试了对数组操作和优化的理解。通过空间复杂度优化,我们学习了如何利用已有的资源(输出数组和变量)减少空间需求。要提升编程能力,关键在于练习如何将问题分解成小的部分,并高效地解决它们。此外,学习如何通过一些小技巧(如变量跟踪)在有限的资源下完成任务也是很重要的。

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

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

相关文章

如何让AI自己检查全文?使用OCR和LLM实现自动“全文校订”(可DIY校订规则)

详细流程及描述参见仓库&#xff08;如果有用的话&#xff0c;请给个收藏&#xff09;&#xff1a; GitHub - xurongtang/DocRevision_Proj: A simple project about how to revist docment (such as your academic paper) in a automatic way with the help of OCR and LLM.A…

DFT测试之TAP/SIB/TDR

TAP的作用 tap全称是test access port&#xff0c;是将jtag接口转为reset、sel、ce、ue、se、si、tck和so这一系列测试组件接口的模块。 jtag的接口主要是下面几个信号&#xff1a; 信号名称信号方向信号描述TCK&#xff08;测试时钟&#xff09;输入测试时钟&#xff0c;同…

【推荐算法】DeepFM:特征交叉建模的革命性架构

DeepFM&#xff1a;特征交叉建模的革命性架构 一、算法背景知识&#xff1a;特征交叉的演进困境1.1 特征交叉的核心价值1.2 传统方法的局限性 二、算法理论/结构&#xff1a;双路并行架构2.1 FM组件&#xff1a;显式特征交叉专家2.2 Deep组件&#xff1a;隐式高阶交叉挖掘机2.3…

数据库表中「不是 null」的含义

例图&#xff1a; 1.勾选了「不是 null」&#xff08;NOT NULL&#xff09;&#xff1a; 这个字段在数据库中必须有值&#xff0c;不能为空。也就是说&#xff0c;你插入数据的时候&#xff0c;必须给它赋值&#xff0c;否则插入会报错。 2.没有勾选「不是 null」&#xff…

Visual Studio问题记录

程序"xxx dotnet.exe"已退出&#xff0c;返回值为-2147450730 问deepseek&#xff1a;visual studio输出程序dotnet.exe已退出&#xff0c;返回值为-2147450730 dotnet.exe 编译时退出并返回错误代码 **-2147450730**&#xff08;十六进制 0x80008076&#xff09;&…

重启路由器ip不变怎么回事?原因分析与解决方法

在日常生活中&#xff0c;我们经常会遇到网络问题&#xff0c;而重启路由器是解决网络故障的常用方法之一。然而&#xff0c;有些用户发现&#xff0c;即使重启了路由器&#xff0c;自己的IP地址却没有变化&#xff0c;这让他们感到困惑。那么&#xff0c;重启路由器IP不变是怎…

实践篇:利用ragas在自己RAG上实现LLM评估②

文章目录 使用ragas做评估在自己的数据集上评估完整代码代码讲解1. RAG系统构建核心组件初始化文档处理流程 2. 评估数据集构建3. RAGAS评估实现1. 评估数据集创建2. 评估器配置3. 执行评估 本系列阅读&#xff1a; 理论篇&#xff1a;RAG评估指标&#xff0c;检索指标与生成指…

高精度滚珠导轨在医疗设备中的多元应用场景

在医疗行业不断追求高效、精准与安全的今天&#xff0c;医疗设备的性能优化至关重要。每一个精密部件都像是设备这个庞大“生命体”中的细胞&#xff0c;共同维持着设备的稳定运行。滚珠导轨&#xff0c;这一看似不起眼却功能强大的传动元件&#xff0c;正悄然在医疗设备领域发…

JavaScript性能优化实战:从核心原理到工程实践的全流程解析

下面我给出一个较为系统和深入的解析&#xff0c;帮助你理解和实践“JavaScript 性能优化实战&#xff1a;从核心原理到工程实践的全流程解析”。下面的内容不仅解释了底层原理&#xff0c;也结合实际工程中的最佳模式和工具&#xff0c;帮助你在项目中贯彻性能优化理念&#x…

【应用】Ghost Dance:利用惯性动捕构建虚拟舞伴

Ghost Dance是葡萄牙大学的一个研究项目&#xff0c;研究方向是探索人与人之间的联系&#xff0c;以及如何通过虚拟舞伴重现这种联系。项目负责人Cecilia和Rui利用惯性动捕创造出具有流畅动作的虚拟舞伴&#xff0c;让现实中的舞者也能与之共舞。 挑战&#xff1a;Ghost Danc…

使用 Mechanical 脚本获取联合反作用力和力矩

介绍 在上一篇文章中&#xff0c;我们详细介绍了在 Ansys Mechanical 静态/瞬态结构、随机振动和/或响应谱分析中提取所有螺栓连接的反作用力的过程。他&#xff0c;我们将讨论如何使用 Python 代码结果对象对关节连接执行相同的作&#xff0c;这对于随机振动/响应谱分析非常有…

微服务架构下的服务注册与发现:Eureka 深度解析

&#x1f4e6; 一、引言 &#x1f310; 微服务架构中服务注册与发现的核心价值 在微服务架构中&#xff0c;服务注册与发现是支撑系统可扩展性、高可用性和动态管理的关键基础。 ✅ 核心价值解析 动态扩展与弹性伸缩 服务实例可随时上线/下线&#xff0c;无需手动更新配置&am…

Qt/C++学习系列之QButtonGroup的简单使用

Qt/C学习系列之QButtonGroup的简单使用 前言QButtonGroup刨析源码 具体使用界面设计具体函数使用初始化信号与槽函数&#xff08;两种方式&#xff09; 总结 前言 在练手项目中&#xff0c;使用了QButtonGroup。项目需求有互斥的要求&#xff0c;在使用QRadioButton的基础上&a…

CETOL 6σ v12.1 三维公差分析软件现已可供下载

一、新版本发布 德克萨斯州麦金尼 — 2025年6月5日 —Sigmetrix 宣布其最新版本的 CETOL 6σ 公差分析软件&#xff08;v12.1&#xff09;现已可供立即下载。公差分析在诸多方面为企业发展带来益处。它通过平衡质量与制造成本&#xff0c;助力企业提升盈利能力。企业还可借此缩…

【JavaEE】Spring Boot项目创建

Spring Boot介绍 在学习Spring Boot之前&#xff0c;我们先来认识一下Spring Spring官方是这样介绍的&#xff1a; 可以看到&#xff0c;Spring让Java程序更加快速&#xff0c;简单和安全。Spring对于速度&#xff0c;简单性和生产力的关注使其成为世界上最流行的Java框架 Sp…

KAG与RAG在医疗人工智能系统中的多维对比分析

1、引言 随着人工智能技术的迅猛发展,大型语言模型(LLM)凭借其卓越的生成能力在医疗健康领域展现出巨大潜力。然而,这些模型在面对专业性、时效性和准确性要求极高的医疗场景时,往往面临知识更新受限、事实准确性不足以及幻觉问题等挑战。为解决这些问题,检索增强生成(…

从零到一:Maven 快速入门教程

目录 Maven 简介Maven 是什么为什么使用 Maven&#xff1f; 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …

postman基础

前言 本次 Chat 将结合业界广为推崇和使用的 RestAPI 设计典范 Github API&#xff0c;详细介绍 Postman 接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习 Postman&#xff1f;…

python训练营day45

知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensorbo…

Halcon透视矩阵

在 Halcon中&#xff0c;透视变换矩阵用于将图像从一个视角转换到另一个视角&#xff0c;常用于图像校正和几何变换。以下是计算透视变换矩阵的步骤及代码示例。 透视形变图像校正的步骤 对图像左简单的处理&#xff0c;分割要校正的区域&#xff1b;提取区域的顶点坐标信息&…