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

题目描述

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

思路分析

解法一:前缀积 + 后缀积(推荐)

核心思路

  • 结果 res[i] 等于左侧前缀积与右侧后缀积的乘积。
  • 第一次遍历构造左侧前缀积,第二次从右往左把后缀积乘入结果。
  • 不需要额外数组保存后缀积,仅用一个变量滚动维护。


复杂度分析

  • 时间复杂度:O(n),其中 n 为数组长度。
  • 空间复杂度:O(1),不计输出数组。
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        res[0] = 1;

        // 构造左侧前缀积
        for (int i = 1; i < n; i++) {
            res[i] = res[i - 1] * nums[i - 1];
        }

        // 从右往左乘入后缀积
        int right = 1;
        for (int i = n - 1; i >= 0; i--) {
            res[i] *= right;
            right *= nums[i];
        }

        return res;
    }
}
func productExceptSelf(nums []int) []int {
    n := len(nums)
    res := make([]int, n)
    res[0] = 1

    // 构造左侧前缀积
    for i := 1; i < n; i++ {
        res[i] = res[i-1] * nums[i-1]
    }

    // 从右往左乘入后缀积
    right := 1
    for i := n - 1; i >= 0; i-- {
        res[i] *= right
        right *= nums[i]
    }

    return res
}

相似题目

题目 难度 考察点
42. 接雨水 困难 双指针
152. 乘积最大子数组 中等 动态规划
724. 寻找数组的中心下标 简单 前缀和
560. 和为 K 的子数组 中等 前缀和
1352. 最后 K 个数的乘积 中等 前缀积
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/75606665
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!