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

题目:


分析:

方法一:使用连乘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]。

1A1A2……An-2An-1
A01A2……An-2An-1
A0A11……An-2An-1
A0A1……1An-2An-1
A0A1……An-31An-1
A0A1……An-3An-21

可以看出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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值