You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leetcode题Product of Array Except Self双循环逻辑疑问求助

解析Product of Array Except Self的双循环逻辑

这段代码的核心思路是利用前缀乘积和后缀乘积,直接在结果数组上分步计算,不需要额外开辟前缀/后缀数组来节省空间。下面针对示例输入nums = [1,2,3,4],一步步拆解两个循环的执行过程,帮你理清逻辑:

原代码回顾

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int ans[] = new int[nums.length];
        int pre = 1, post = 1;

        for(int i = 0; i < nums.length;i++) {
            ans[i] = pre;
            pre *= nums[i];
        }

        for(int i = nums.length - 1; i >= 0;i--) {
            ans[i] *= post;
            post *= nums[i];
        }

        return ans;
    }
}

第一个循环(左到右,计算前缀乘积)

初始状态:ans = [0,0,0,0],pre = 1
循环逻辑:先将当前前缀乘积pre赋值给ans[i],再更新pre为pre * nums[i](即包含当前元素的前缀乘积)

  • i=0:
    • ans[0] = pre → ans[0] = 1
    • pre = pre * nums[0] → pre = 1*1 = 1
    • 当前ans数组:[1, 0, 0, 0]
  • i=1:
    • ans[1] = pre → ans[1] = 1
    • pre = 1*2 = 2
    • 当前ans数组:[1, 1, 0, 0]
  • i=2:
    • ans[2] = pre → ans[2] = 2
    • pre = 2*3 = 6
    • 当前ans数组:[1, 1, 2, 0]
  • i=3:
    • ans[3] = pre → ans[3] = 6
    • pre = 6*4 = 24
    • 当前ans数组:[1, 1, 2, 6]

你之前手动计算第一个循环得到的[1,2,6,24]是错误的,问题出在顺序搞反了——代码是先赋值ans[i],再更新pre,而不是把更新后的pre直接赋值给ans[i]。

第二个循环(右到左,乘以后缀乘积)

初始状态:post = 1,当前ans数组为[1,1,2,6]
循环逻辑:先将ans[i]乘以后缀乘积post,再更新post为post * nums[i](即包含当前元素的后缀乘积)

  • i=3:
    • ans[3] = 6 * 1 = 6
    • post = 1*4 = 4
    • 当前ans数组:[1, 1, 2, 6]
  • i=2:
    • ans[2] = 2*4 = 8
    • post = 4*3 = 12
    • 当前ans数组:[1, 1, 8, 6]
  • i=1:
    • ans[1] = 1*12 = 12
    • post = 12*2 = 24
    • 当前ans数组:[1, 12, 8, 6]
  • i=0:
    • ans[0] = 1*24 = 24
    • post = 24*1 = 24
    • 当前ans数组:[24, 12, 8, 6]

此时得到的结果正好符合预期输出。

逻辑本质

对于数组中任意位置i:

  • 第一个循环结束后,ans[i]存储的是nums[0]到nums[i-1]的乘积(即i左侧所有元素的乘积)
  • 第二个循环中,post变量动态维护的是nums[i+1]到nums[n-1]的乘积(即i右侧所有元素的乘积)
  • 两者相乘就得到了除nums[i]之外所有元素的乘积,完全符合题目的要求。

内容的提问来源于stack exchange,提问作者Anscom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:12:49