Given an integers array A.
Define B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], calculate B WITHOUT divide operation.
Example
For A = [1, 2, 3]
, return [6, 3, 2]
.
分成两个数组分别储存(1, A[0], A[0] * A[1], .....) (.....A[n - 2] * A[n - 1], A[n - 1], 1), 最后将两个数组对应位相乘。
public class Solution {
/**
* @param A: Given an integers array A
* @return: A Long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
*/
public ArrayList<Long> productExcludeItself(ArrayList<Integer> A) {
List<Long> left = new ArrayList<Long>();
List<Long> right = new ArrayList<Long>();
ArrayList<Long> B = new ArrayList<Long>();
for(int i = 0; i < A.size(); i++) {
if(i == 0) {
left.add(Long.valueOf(1));
right.add(Long.valueOf(1));
}
else {
Long tmp = Long.valueOf(left.get(left.size() - 1));
left.add(A.get(i - 1) * tmp);
tmp = right.get(0);
right.add(0, tmp * A.get(A.size() - 1 - i + 1));
}
}
for(int i = 0; i < A.size(); i++) {
Long tmp = Long.valueOf(left.get(i) * right.get(i));
B.add(tmp);
}
return B;
}
}