《剑指offer》面试题66:构建乘积数组

    xiaoxiao2022-07-13  152

    题目:给定数组A[0,1…n-1],求B[0,1…n-1],要求B[i] = A[0]*A[1]…A[i-1]*A[i+1]…A[n-1],不能使用除法。

    思路:

    使用纯乘法,还有更高效的思路。定义C[i]=A[0]*A[1]…A[i-1],那么C[i]=C[i-1]A[n-1];定义D[i]=A[i+1]…A[n-2]*A[n-1],那么D[i] =D[i+1]*A[i+1];因此C[i],D[i]都可以递推地求出来,且B[i]=C[i]*D[i]。

    java参考代码如下:

    package chapter6; public class P313_ConstructArray { public static int[] multiply(int[] A){ if(A==null||A.length<1) return new int[]{-1}; int n=A.length; int[] B=new int[n];//B[i] = A[0]*A[1]...A[i-1]*A[i+1]...A[n-1] int[] C=new int[n];//C[i]=A[0]*A[1]...A[i-1] int[] D=new int[n];//D[i]=A[i+1]*...A[n-2]*A[n-1] C[0]=1;//人为规定 D[n-1]=1;//人为规定 for(int i=1;i<n;i++){ C[i]=C[i-1]*A[i-1]; } for(int i=n-2;i>=0;i--){ D[i]=D[i+1]*A[i+1]; } for(int i=0;i<n;i++){ B[i]=C[i]*D[i]; } return B; } public static void main(String[] args){ int[] data = new int[]{1,2,3,4,5}; int[] result = multiply(data); for(int i=0;i<result.length;i++){//{120,60,40,30,24} System.out.print(result[i]); System.out.print(" "); } } }

    参考:

    https://www.jianshu.com/p/fa1e332f7d92

    最新回复(0)