构建乘积数组,有没有更好的办法,欢迎讨论

构建乘积数组

http://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46

平民解法:使用一个临时变量temp维护上三角的乘积:

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        int len = A.length;
        int[] B = new int[len];
        //B[i]等于除了A[i]以外的数的乘积
        int sum = 1;
        for(int i=1; i<len; i++){
            sum *= A[i];
            B[i] = 1;
        }
        B[0] = sum;
        int temp1 = 1;    //不能使用除法,只能维护一个从前往后的乘积变量以减少乘积遍历
        for(int i=1; i<len; i++){
            for(int j=i+1; j<len; j++){
                B[i] *= A[j];
            }
            temp1 *= A[i-1];
            B[i] *= temp1;
        }
        return B;
    }
}

下面使用两个for循环,分别计算上下三角,降低复杂度:

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        int len = A.length;
        int[] B = new int[len];
        //根据规律,可将对角线为1做乘积,分为上下三角分别计算
        //下三角初始化第一行
        B[0]=1;
        for(int i=1;i<len;i++){
            B[i]=B[i-1]*A[i-1];    //首项是B[1]=B[0]*A[0]
        }
        //上三角初始化最后一行
        int temp=1;
        for(int i=len-1;i>=0;i--){
            B[i]=temp*B[i];        //首项是B[len-1]=B[len-1]*1(最后一个元素按1处理,最后一行的乘积在上面的循环中已经算出)
            temp=A[i]*temp;
        }
        return B;
    }
}
全部评论

相关推荐

哇哇的菜鸡oc:他这不叫校招offer,而是实习offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务