Given an array of numbers, nums, return an array of numbers products, where products[i] is the product of all nums[j], j != i.
Input : [1, 2, 3, 4, 5]
Output: [(2*3*4*5), (1*3*4*5), (1*2*4*5), (1*2*3*5), (1*2*3*4)]
= [120, 60, 40, 30, 24]
You must do this in O(N) without using division.
先建立一个array A,从右到左遍历,A[i]是这个东西右边所有东西的product。
然后从左边开始遍历,maintain在i位置左边的乘积, 乘上A[i]即可。
public static int[] product(int[] input) {
int[] rightProd = new int[input.length];
p = 1;
for (int i = input.length - 1; i >= 0; i--) {
rightProd[i] = p;
p *= input[i];
}
int[] resProd = new int[input.length];
int left = 1;
for (int i = 0; i < input.length; i++) {
resProd[i] = left * rightProd[i];
left *= input[i];
}
return resProd;
}
Another way, O(1) space
//here left is always the product on i's left
//and right is always the product on length-1-i's right.
public int[] products(int[] A) {
if (A == null || A.length == 0) {
return null;
}
int[] B = new int[A.length];
for (int i = 0; i < B.length; ++i) {
B[i] = 1;
}
int left = 1, right = 1;
for (int i = 0; i < A.length; ++i) {
B[i] *= left;
B[A.length-1-i] *= right;
left *= A[i];
right *= A[A.length-1-i];
}
return B;
}