【牛客 - 剑指offer】JZ66 构建乘积数组 两种方案 Java实现


剑指offer题解汇总 Java实现

https://blog.csdn.net/guliguliguliguli/article/details/126089434

本题链接

知识分类篇 - 其他算法 - JZ66 构建乘积数组

题目

在这里插入图片描述

思路 & 代码

方案一 最朴素思想 二重循环

import java.util.*;
import java.util.ArrayList;

public class Solution {
    public int[] multiply(int[] A) {

        int[] B = new int[A.length];

        int res;

        for (int i = 0; i < A.length; i++) {

            res = 1;

            for (int j = 0; j < A.length; j++) {

                if (i == j) {
                    continue;
                }
                res *= A[j];
            }
            B[i] = res;
        }

        return B;
    }
}

方案二 双向遍历A数组

在这里插入图片描述

根据题意,B[i]数组的值是A数组中除了A[i]的所有数的乘积

构建下三角

所以,观察上图,可以将B[0]赋值为1,然后B[i] = B[i-1] x A[i-1],这样就完成了下三角的构建,此时

B[0] = 1
B[1] = 1 x A[0]
B[2] = B[1] x A[1] = 1 x A[0] x A[1]

构建上三角

用一个变量(代码中定义为res,初始化值为1)来存储从右往左遍历时,记录下每一项累积的乘积

最终遍历两次A数组就解决了,当数据量很大的时候,效率肯定是比方案一的二重循环的效率要高的

import java.util.*;
import java.util.ArrayList;

public class Solution {
    public int[] multiply(int[] A) {

        int[] B = new int[A.length];
        B[0] = 1;
        //从左往右遍历A,构建下三角
        for (int i = 1; i < A.length; i++) {
            B[i] = B[i - 1] * A[i - 1];
        }

        //从右往左遍历A,构建上三角
        //用一个变量来记录累成
        int res = 1;

        for (int i = A.length - 1; i >= 0; i--) {
            B[i] *= res;
            res *= A[i];
        }

        return B;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值