题目:
分析:
方法一:使用连乘n-1个数字,计算B[i]时遇到i时continue即可。
public List<Long> productExcludeItself(List<Integer> nums) {
// write your code here
List<Long> list=new ArrayList<>();
if(nums==null || nums.size()<0) return list;
int indexB=0;
while(indexB<nums.size()){
long result=1;
for(int i=0;i<nums.size();i++){
if(i==indexB) continue;
result*=nums.get(i);
}
list.add(result);
indexB++;
}
return list;
}
方法二:把B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]分割成两块,为C[i]=A[0] * ... * A[i-1] 和D[i]=A[i+1] * ... * A[n-1]。C[i]可以用自上而下的顺序计算出来,C[0]=1,C[i]=C[i-1]*A[i-1],D[i]可以用自下往上的顺序计算出来,D[len-1]=1,D[i]=D[i+1]*A[i+1]。
1 | A1 | A2 | …… | An-2 | An-1 |
A0 | 1 | A2 | …… | An-2 | An-1 |
A0 | A1 | 1 | …… | An-2 | An-1 |
A0 | A1 | …… | 1 | An-2 | An-1 |
A0 | A1 | …… | An-3 | 1 | An-1 |
A0 | A1 | …… | An-3 | An-2 | 1 |
可以看出B[i]=C[i]*D[i];
public class Solution {
/*
* @param nums: Given an integers array A
* @return: A long long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
*/
public List<Long> productExcludeItself(List<Integer> nums) {
List<Long> list=new ArrayList<>();
int len=nums.size();
long[] D=new long[len]; //从后往前遍历保存数值的数组
D[len-1]=1;
int i;
for(i=len-2;i>=0;i--){
D[i]=D[i+1]*nums.get(i+1);
}
long[] C=new long[len]; //从前往后遍历保存数值的数组
C[0]=1;
for(i=1;i<len;i++){
C[i]=C[i-1]*nums.get(i-1);
}
for(i=0;i<len;i++){
list.add(C[i]*D[i]);
}
return list;
}
}