【剑指offer】-构建乘积数组-42/67

简介: 【剑指offer】-构建乘积数组-42/67

1. 题目描述

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

2. 题目分析

  1. 我们可以比较清晰的看出,B数组中的值等于A数组中的值所有的乘积(不包括B下标)
  2. 类似于:B[1] = A[0] * A[2] * A[3] * A[4];因为题目描述中,不可以使用除法,所以我们没有办法用A数组的乘积除以B[i],我们画一个二维矩阵图来看一下。

    类似于上图,也就是说我们要先计算前半部分的乘积然后在乘以后半部分的乘积,这样可以得到一个完整的数组B。
  3. 具体思路,从前往后循环遍历一遍数组,依次相乘,这样数组的前半部分已经存储好,再从后往前循环遍历一遍数组,依次相乘,最后返回数组B

3. 题目代码

public static int[] multiply(int[] A) {
    if (A.length == 0) {
      return new int[0];
    }
    int[] B = new int[A.length];
    B[0] = 1;
    for (int i = 1; i < A.length; i++) {
      B[i] = B[i - 1] * A[i - 1];
    }
    int temp = 1;
    for (int i = A.length - 1; i >= 0; i--) {
      B[i] = temp * B[i];
      temp = temp * A[i];
    }
    return B;
  }


相关文章
|
8月前
|
算法
简记二分算法模板与代码案例:整数二分和浮点数二分
本文介绍了两种算法模板,分别是整数二分和浮点数二分。
62 0
|
8月前
|
算法 测试技术 C#
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
|
8月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
8月前
|
存储 算法
算法题解-除自身以外数组的乘积
算法题解-除自身以外数组的乘积
|
8月前
|
存储 测试技术 索引
每日一题——除自身以外数组的乘积
每日一题——除自身以外数组的乘积
|
8月前
|
存储 人工智能 Java
每日一题《剑指offer》数组篇之构建乘积数组
每日一题《剑指offer》数组篇之构建乘积数组
50 0
每日一题《剑指offer》数组篇之构建乘积数组
|
8月前
|
存储 算法 Java
【算法训练-数组 二】【元素组合】两数之和、三数之和
【算法训练-数组 二】【元素组合】两数之和、三数之和
64 0
|
人工智能 算法 BI
剑指offer(C++)-JZ66:构建乘积数组(算法-其他)
剑指offer(C++)-JZ66:构建乘积数组(算法-其他)
|
存储 C语言 C++
【前缀和】238. 除自身以外数组的乘积/剑指 Offer 66. 构建乘积数组
【前缀和】238. 除自身以外数组的乘积/剑指 Offer 66. 构建乘积数组
76 0
|
存储 人工智能 算法
剑指offer 74. 构建乘积数组
剑指offer 74. 构建乘积数组
64 0