LintCode 50 & 剑指Offer:数组剔除元素后的乘积

题目:

LintCode 50 & 剑指Offer:数组剔除元素后的乘积_第1张图片

分析:

方法一:使用连乘n-1个数字,计算B[i]时遇到i时continue即可。

public List productExcludeItself(List nums) {
        // write your code here
        List list=new ArrayList<>();
        if(nums==null || nums.size()<0) return list;
        int indexB=0;
        while(indexB

方法二:把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 productExcludeItself(List nums) {
        List 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

你可能感兴趣的:(LintCode)