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

217 阅读2分钟

要求:

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

示例:

输入: [1,2,3,4]
输出: [24,12,8,6]

说明:

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

思路:

这道题目和剑指offer里面的一道题很像,就是不允许使用除法,但是需要算出一堆数的乘积,相当于把自己当成1,其余的数不变,乘起来,输出值。

其实可以把数组理解成一个n×n的数组,行列值相等时该数组中位置的值为1,即对角线上数字为1,所以每次相乘的时候,左边就是一部分,右边又是一部分,两个部分一起乘最后就能得到答案了。所以我们使用两个循环。

解决方案:

  1. 新建一个数组,长度和输入数组长度一致
  2. 给两个参数,p,q均为1
  3. 先从左往右遍历一次,第一个数为1,第二个数为nums[0],因为计算res[1]的时候,它左边需要乘的数是nums[0],右边需要乘的数是nums[2]到nums[len-1],接下来以此类推
  4. 再从右往左遍历一次,这时候就需要填补每次相乘需要的右边的数了,而且是从下往上遍历,因为最后那个数是右边为0的,每次不断往上乘,乘到第一个数就是遍历结束了。

代码:

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        int p = 1;
        int q = 1;
        for (int i = 0;i < len; i++) {
            res[i] = p;
            p *= nums[i];
        }
        
        for (int i = len-1; i >= 0; i--) {
            res[i] *= q;
            q *= nums[i];
        }
        return res;
    }
}