LeetCode 题解:除自身以外数组的乘积

LeetCode 题解:除自身以外数组的乘积

在刷 LeetCode 的过程中,“除自身以外数组的乘积” 是一道经典的数组类题目,这道题不仅考察对数组遍历的理解,还要求在时间和空间复杂度上做到最优。今天就来分享这道题的高效解法,核心思路是通过两次遍历、利用两个变量分别记录左右侧乘积,实现时间复杂度 O (n)、空间复杂度 O (1)的最优解。

题目描述

给你一个长度为 n 的整数数组 nums,返回一个数组 ans,其中 ans [i] 等于 nums 中除 nums [i] 之外其余所有元素的乘积。要求不能使用除法,且在 O (n) 时间复杂度内完成,额外空间复杂度尽可能优化(除了答案数组外,仅使用常数级空间)。

解题思路

核心思想是拆分乘积计算:将 “除当前元素外所有元素的乘积” 拆分为 “当前元素左侧所有元素的乘积 × 当前元素右侧所有元素的乘积”,通过两次遍历分别计算左右侧乘积,最终合并结果。

具体步骤:

  1. 定义两个变量 leftright,分别表示当前元素左侧所有元素的乘积、右侧所有元素的乘积,初始值均为 1(因为单个元素的左侧 / 右侧无元素,乘积为 1)。
  2. 定义答案数组 ans,长度与输入数组 nums 一致。
  3. 左到右遍历:遍历每个元素时,先将当前 left(即该元素左侧所有元素的乘积)存入 ans[i],再更新 leftleft × nums[i](为下一个元素的左侧乘积做准备)。
  4. 右到左遍历:遍历每个元素时,将 ans[i](左侧乘积)乘以当前 right(右侧乘积),得到最终的 “除自身外所有元素的乘积”,再更新 rightright × nums[i](为前一个元素的右侧乘积做准备)。
  5. 遍历完成后,ans 数组即为最终结果。

复杂度分析

  • 时间复杂度:O (n),仅需两次遍历数组,n 为数组长度。
  • 空间复杂度:O (1),除了存储结果的 ans 数组外,仅使用了 leftright 两个常数级变量(题目通常允许忽略答案数组的空间消耗)。

Java 代码

class Solution { public int[] productExceptSelf(int[] nums) { int n = nums.length; // 定义答案数组 int[] ans = new int[n]; // 第一步:左到右遍历,计算每个元素左侧所有元素的乘积 int left = 1; for (int i = 0; i < n; i++) { // 先将左侧乘积存入ans[i] ans[i] = left; // 更新left,为下一个元素的左侧乘积做准备 left *= nums[i]; } // 第二步:右到左遍历,计算右侧乘积并与左侧乘积相乘 int right = 1; for (int i = n - 1; i >= 0; i--) { // 左侧乘积 × 右侧乘积 = 最终结果 ans[i] *= right; // 更新right,为前一个元素的右侧乘积做准备 right *= nums[i]; } return ans; } } 

代码解析

  1. 初始化阶段
    • int n = nums.length; 获取数组长度,用于定义答案数组和遍历边界。
    • int[] ans = new int[n]; 初始化答案数组,存储最终结果。
  2. 左到右遍历
    • left 初始为 1,因为第一个元素左侧无元素,乘积为 1。
    • 遍历到第 i 个元素时,先把 left(左侧乘积)赋值给 ans[i],再让 left 乘以当前元素 nums[i],这样遍历结束后,ans[i] 存储的是第 i 个元素左侧所有元素的乘积。
  3. 右到左遍历
    • right 初始为 1,因为最后一个元素右侧无元素,乘积为 1。
    • 遍历到第 i 个元素时,将 ans[i](左侧乘积)乘以 right(右侧乘积),得到该位置的最终结果;再让 right 乘以当前元素 nums[i],为前一个元素的右侧乘积做准备。

示例验证

以输入 nums = [1,2,3,4] 为例:

  • 左到右遍历后,ans = [1, 1, 2, 6](分别对应每个元素左侧乘积:1、1、1×2、1×2×3)。
  • 右到左遍历:
    • i=3:ans[3] = 6 × 1 = 6right = 1×4=4
    • i=2:ans[2] = 2 × 4 = 8right = 4×3=12
    • i=1:ans[1] = 1 × 12 = 12right = 12×2=24
    • i=0:ans[0] = 1 × 24 = 24right = 24×1=24
  • 最终 ans = [24,12,8,6],符合 “除自身外所有元素乘积” 的结果。

总结

这道题的核心是拆分乘积计算,通过两次遍历分别处理左右侧乘积,避免了使用除法和额外的数组存储左右乘积,是空间优化的经典思路。关键点总结:

  1. 利用两个变量 leftright 分别记录当前元素的左右侧乘积,替代额外数组,实现空间复杂度 O (1);
  2. 两次遍历的顺序(先左后右)保证了每个位置的乘积能被逐步计算;
  3. 遍历过程中 “先赋值后更新” 的逻辑,确保了当前元素不会被包含到自身的左右乘积中。

这种思路不仅适用于这道题,也可以迁移到其他需要 “左右侧遍历” 的数组类题目中,希望能帮助大家理解和掌握~

Read more

一文带你掌握Visual Studio中集成的git功能

一文带你掌握Visual Studio中集成的git功能

前言 Visual Studio中深度集成了git功能,可以很方便的进行源代码版本控制功能。 大部分日常的操作我们可以通过界面来完成,这样就省去了输入git命令的时间,也可以不用记很多参数。 但这毕竟是辅助工具,掌握常用的git命令行还是很有必要的。 言归正传,接下来开始介绍Visual Studio 中集成的git功能。 本文以Visual Studio 2022为例进行演示 安装 Visual Studio的UI中已经集成了git相关功能,但是也需要安装git后才能使用。 如果没有安装git,在使用相关功能时,可能会看到如下的提示 安装方式可以通过以下两种 1、在Visual Studio的安装程序中,钩选<适用于Windows的Git> 推荐使用这种方式,因为免去了单独下载和安装的环节 2、访问git官方网站,下载安装包手动安装 下载地址:Git - Install for Windows 导入/克隆(clone)代码 方法1、在Visual Studio的启动界面上选择克隆存储库 输入

By Ne0inhk

极致压缩:Whisper.cpp 量化版本清单与 ggml 格式模型下载

Whisper.cpp 量化模型下载指南 Whisper.cpp 是 OpenAI Whisper 语音识别模型的高效 C++ 实现,支持量化技术来减小模型尺寸,实现“极致压缩”。量化通过降低模型参数的精度(如从 32 位浮点数到 4 位整数)来减少存储和计算需求,同时保持合理的准确性。ggml 格式是一种轻量级模型格式,专为资源受限设备优化。以下信息基于 Whisper.cpp 官方 GitHub 仓库(真实可靠),我将逐步引导您获取量化版本清单和下载链接。 1. 量化版本清单 Whisper.cpp 支持多种量化级别,每种对应不同的压缩率和精度权衡。以下是常见量化版本清单(基于最新官方数据): * q4_0:4 位量化,极致压缩,模型尺寸最小,适合内存受限设备(如嵌入式系统)。精度损失较高。

By Ne0inhk

揭秘VSCode Copilot无法登录原因:5步快速恢复访问权限

第一章:VSCode Copilot无法登录问题概述 Visual Studio Code(VSCode)中的GitHub Copilot作为一款智能代码补全工具,极大提升了开发者的编码效率。然而,在实际使用过程中,部分用户频繁遭遇Copilot无法正常登录的问题,导致功能受限或完全不可用。该问题可能由多种因素引发,包括网络连接异常、身份验证失效、插件配置错误或系统环境限制等。 常见表现形式 * 点击“Sign in to GitHub”后无响应或弹窗无法加载 * 登录完成后仍提示“GitHub authentication failed” * Copilot状态始终显示为“Not signed in” 基础排查步骤 1. 确认网络可正常访问GitHub服务,必要时配置代理 2. 检查VSCode是否已更新至最新版本 3. 重新安装GitHub Copilot及GitHub Authentication扩展 验证身份认证状态 可通过开发者工具查看认证请求是否成功发出。在VSCode中按 F1,输入 Developer: Open

By Ne0inhk

AIGC 应用工程师、人工智能训练工程师、人工智能算法工程师、人工智能标注工程师、AI智能体应用工程师、生成式人工智能应用工程师

(一)报考条件:年满18周岁 (二)报名及考试流程  1.  学生填写报名表:姓名、性别、身份证号、电话号码、所报证书名称、级别,务必保证信息正确。 2. 使用电子照片要求: 背景颜色:蓝色、白色; 3. 拿证周期:3-4个月 人工智能应用工程师(高级)课程体系解读 课程体系围绕人工智能应用工程师(高级) 职业技能培养,分 6 大阶段,覆盖环境搭建、数据处理、核心算法、实战应用、效果测试与职业考核全流程,是从基础到高阶的完整 AI 应用开发学习路径。 一、阶段核心内容与能力目标 1. 人工智能环境管理 * 核心课程:环境与存储系统配置 * 知识模块:Python/Spark 环境搭建、虚拟机与

By Ne0inhk