构建乘积数组
难度:简单
描述
给定一个数组 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](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。
数据范围
数据范围:1≤n≤10 ,数组中元素满足 ∣val∣≤10
举例
解题思路
方法一:暴力法,直接将除了自身之外的数相乘即可获得答案
方法二:双向遍历
如上图所示,矩阵中由对角线1将其分成了上三角和下三角。我们先看下三角,如果我们累乘的时候,B[1]是在B[0]的基础上乘了新增的一个A[0],B[2]是在B[1]的基础上乘了新增的一个A[1],那我们可以遍历数组的过程中不断将数组B的前一个数与数组A的前一个数相乘就得到了下三角中数组B的当前数。同理啊,我们在上三角中,用一个变量存储从右到左的累乘,每次只会多乘上一个数字。这样,两次遍历就可以解决。
实现代码(java)
方法一:
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A int整型一维数组 * @return int整型一维数组 */ public int[] multiply (int[] A) { // write code here int n = A.length; int[] B = new int[n]; for(int i = 0; i < n; i++){ B[i] = cheng(A,i); } return B; } public int cheng(int[] A,int m){ int sum = 1; for(int i = 0; i < A.length;i++){ if(i!=m){ sum *= A[i]; } } return sum; } }
方法二:
import java.util.ArrayList; public class Solution { public int[] multiply(int[] A) { //初始化数组B int[] B = new int[A.length]; B[0] = 1; //先乘左边,从左到右 for(int i = 1; i < A.length; i++) //每多一位由数组B左边的元素多乘一个前面A的元素 B[i] = B[i - 1] * A[i - 1]; int temp = 1; //再乘右边,从右到左 for(int i = A.length - 1; i >= 0; i--){ //temp为右边的累乘 B[i] *= temp; temp *= A[i]; } return B; } }