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

2022-10-26 18:04:16 浏览数 (1)

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

代码语言:javascript复制
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶: 你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

解:如果不考虑空间复杂度,题目很简单,一个数组存除nums[i]的左边所有数乘积,一个数组存除nums[i]的右边所有数乘。常数空间复杂度可参考以下,比较难想到

代码语言:javascript复制
Given numbers [2, 3, 4, 5], regarding the third number 4, the product of array except 4 is 235 which consists of two parts: left 23 and right 5. The product is leftright. We can get lefts and rights:

Numbers: 2 3 4 5
Lefts: 2 2x3 2x3x4
Rights: 3x4x5 4x5 5
Let’s fill the empty with 1:

Numbers: 2 3 4 5
Lefts: 1 2 2x3 2x3x4
Rights: 3x4x5 4x5 5 1
We can calculate lefts and rights in 2 loops. The time complexity is O(n).
代码语言:javascript复制
public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        int left = 1;
        for (int i = 0; i < len; i  ) {

            if (i > 0) {
                left = left * nums[i - 1];
            }


            res[i] = left;

        }
        int right = 1;
        for (int i = len - 1; i >= 0; i--) {

            if (i < nums.length - 1) {
                right = right * nums[i   1];
            }

            res[i] *= right;
        }
        return res;
    }

0 人点赞