[leedcode 238] Product of Array Except Self
Given an array of n integers where n > 1, nums
, return an array output
such that output[i]
is equal to the product of all the elements of nums
except nums[i]
.
Solve it without division and in O(n).
For example, given [1,2,3,4]
, return [24,12,8,6]
.
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
public class Solution { public int[] productExceptSelf(int[] nums) { /* 则维护当前元素左边所有元素的乘积以及右边所有元素的乘积, 相乘得到 product of array except self ! Because we cannot use division, so assume we have two integer arrays with the same length of nums, int[] leftProd = new int[nums.length]; int[] rightProd = new int[nums.length], we store the product of all the left elements in leftProd and the product of all the right elements in rightProd, then the product of leftProd[i] and rightProd[i] will be the value we want to put into the result. take the example of num[] = {2, 4, 3, 6}, thenleftProd will be {1, 2, 8, 24} , and rightProd will be {72, 18, 6, 1}. 维持两个数组, left[] and right[]. 分别记录 第i个元素 左边相乘的积left[i] and 右边相乘的积right[i]. 那么结果res[i]即为left[i]*right[i]. follow up 要求O(1)空间. 利用返回的结果数组, 这样可以不需要额外的空间. pos主要保存从右向左的乘积,比如第i项,pos代表的是i+1到len-1*/ int[] res=new int[nums.length]; res[0]=1; for(int i=1;i<nums.length;i++){ res[i]=res[i-1]*nums[i-1]; } int pos=1; for(int i=nums.length-1;i>=0;i--){ res[i]=pos*res[i]; pos*=nums[i]; } return res; } }