给定一个整数数组A。
定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。
样例
给出A=[1, 2, 3],返回 B为[6, 3, 2]
采取分治法,减少了重复计算。result[i] = left[i] * right[i] ,left[i] = A[0]*A[1]***A[i-1],right[i] = A[i+1]*A[i+2]***A[len(A)-1]。将最后的乘积分为两部分求解,首先求得左半部分的值,然后求得右半部分的值。最后将左右两半部分乘起来即为解。
时间复杂度 O(n). 使用了左右两半部分辅助空间,空间复杂度 O(2n).
注意:初值left[0] = 1
right[A.size()-1]=1
import java.util.ArrayList;
import java.util.List;
public class productItself {
public static List<Long> productExcludeItself(List<Integer> nums) {
List<Long> n = new ArrayList<Long>();
long element = 1;
if(nums==null||nums.size()==1) {
n.add(element);
return n;
}
long[] left = new long[nums.size()];
long[] right = new long[nums.size()];
left[0] = 1;
for(int i=1;i<nums.size();i++) {
left[i] = left[i-1] * nums.get(i-1);
}
right[nums.size()-1] = 1;
for(int i=nums.size()-2;i>=0;i--) {
right[i] = right[i+1] * nums.get(i+1);
}
for(int i=0;i<nums.size();i++) {
long res = right[i] * left[i];
n.add(res);
}
return n;
// write your code here
}
public static void main(String[] args) {
int[] a = {1, 2, 3, 4};
List<Integer> nums = new ArrayList<Integer>();
for(int k=0;k<a.length;k++) {
nums.add(a[k]);
}
System.out.print(productExcludeItself(nums));
}
}