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

构建乘积数组

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;
    }
}
全部评论

相关推荐

屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
程序员饺子:正常 我沟通了200多个 15个要简历 面试2个 全投的成都的小厂。很多看我是27直接不会了😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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