【LeetCode 189】算法:除自身以外数组的乘积

题目:给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据保证数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。

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

输出: [24,12,8,6]


解决这个问题,简便方法是计算数组中每个元素的前缀乘积和后缀乘积,然后将它们相乘得到该元素最终的乘积,这样就不会计算该元素本身。

我们可以通过两个遍历(一个从左到右,一个从右到左)来实现这个目标,且不使用除法。

具体步骤:

1. 计算前缀乘积:从左到右遍历数组,计算每个元素的前缀乘积。

2. 计算后缀乘积:从右到左遍历数组,计算每个元素的后缀乘积,并与前缀乘积相乘得到最终结果。

我的 Java 代码:

public class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        int[] answer = new int[n];
        
        // 计算前缀乘积
        int prefixProduct = 1;
        for (int i = 0; i < n; i++) {
            answer[i] = prefixProduct;
            prefixProduct *= nums[i];
        }
        
        // 计算后缀乘积,并与前缀乘积相乘
        int suffixProduct = 1;
        for (int i = n - 1; i >= 0; i--) {
            answer[i] *= suffixProduct;
            suffixProduct *= nums[i];
        }
        
        return answer;
    }
}

对于输入 nums = [1, 2, 3, 4],程序的运行过程如下:

计算前缀乘积:answer = [1, 1, 2, 6]

计算后缀乘积,并与前缀乘积相乘:answer = [24, 12, 8, 6]

最终,answer 为 [24, 12, 8, 6]。

posted @ 2025-07-24 16:26  junjunyi  阅读(31)  评论(0)    收藏  举报