跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

除自身以外数组的乘积 - Java 实现

讲解题目“除自身以外数组的乘积”。要求在不能使用除法且时间复杂度为 O(n) 的情况下,计算每个位置除自身外其余元素的乘积。核心思路是将结果拆分为左侧乘积与右侧乘积的乘积,通过两次遍历分别计算并合并。文章提供了 Java 代码实现,包含初始化、左到右遍历记录左侧累积值、右到左遍历结合右侧累积值得出最终结果的过程。该方法空间复杂度为 O(1),是处理此类数组问题的经典优化方案。

HadoopMan发布于 2026/3/24更新于 2026/7/546 浏览
除自身以外数组的乘积 - Java 实现

题目描述

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

解题思路

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

具体步骤:

  1. 定义两个变量 left 和 right,分别表示当前元素左侧所有元素的乘积、右侧所有元素的乘积,初始值均为 1。
  2. 定义答案数组 ans,长度与输入数组 nums 一致。
  3. 左到右遍历:遍历每个元素时,先将当前 left 存入 ans[i],再更新 left 为 left × nums[i]。
  4. 右到左遍历:遍历每个元素时,将 ans[i] 乘以当前 right,得到最终结果,再更新 right 为 right × nums[i]。
  5. 遍历完成后,ans 数组即为最终结果。
复杂度分析
  • 时间复杂度:O(n),仅需两次遍历数组。
  • 空间复杂度:O(1),仅使用了 left 和 right 两个常数级变量。

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] = left;
            left *= nums[i];
        }
        int right = 1;
        for (int i = n - 1; i >= 0; i--) {
            ans[i] *= right;
            right *= nums[i];
        }
        return ans;
    }
}

代码解析

  1. 初始化阶段:获取数组长度,初始化答案数组。
  2. 左到右遍历:left 初始为 1,遍历到第 i 个元素时,先把 left 赋值给 ans[i],再让 left 乘以当前元素 nums[i]。
  3. 右到左遍历:right 初始为 1,遍历到第 i 个元素时,将 ans[i] 乘以 right,再让 right 乘以当前元素 nums[i]。

示例验证

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

  • 左到右遍历后,ans = [1, 1, 2, 6]。
  • 右到左遍历:
    • i=3:ans[3] = 6 × 1 = 6,right = 1×4=4;
    • i=2:ans[2] = 2 × 4 = 8,right = 4×3=12;
    • i=1:ans[1] = 1 × 12 = 12,right = 12×2=24;
    • i=0:ans[0] = 1 × 24 = 24,right = 24×1=24;
  • 最终 ans = [24,12,8,6]。

总结

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

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

目录

  1. 题目描述
  2. 解题思路
  3. 复杂度分析
  4. Java 代码
  5. 代码解析
  6. 示例验证
  7. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • VMware 安装配置 Ubuntu 24.04 LTS 实战指南
  • C++ 继承机制详解:从概念到多继承模型
  • 贪心算法核心解析:局部最优策略与经典应用实践
  • 鸿蒙金融理财项目:生态合作与用户运营优化
  • Wine跨平台兼容性解析:在Linux和macOS运行Windows程序
  • 鸿蒙金融理财全栈项目:生态合作、用户运营与数据变现优化
  • 算法实战:一维与二维前缀和模板详解
  • Linux 网络编程实战:HTTP 协议解析与 C++ 服务器实现
  • 滑动窗口算法实战:最小长度子数组与最长无重复子串
  • Flutter 与 Kotlin 对比:移动应用开发选型指南
  • Java 利用 Spire.XLS 精确控制 Excel 打印页边距
  • C++ 哈希表使用与底层实现原理
  • 前端转 Java 后端开发指南
  • 逻辑回归详解:从原理到代码实现
  • Linux LVM 磁盘管理工具详解:物理卷、卷组与逻辑卷操作
  • Git 新建分支后首次推送到远程仓库的步骤
  • 基于 FPGA 的快速傅里叶变换实现
  • 大模型在智能客服领域的应用现状与最佳实现路径
  • WhisperX 语音识别工具:为何优于传统方案
  • DownGit:GitHub 文件夹精准下载工具

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online