剑指offer——构建乘积数组
【题目描述】
给定一个数组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]。不能使用除法
【解题思路】
不能使用遍历的方法,那样时间复杂度是O(n2),时间复杂度太大。
找规律的方法,对B找规律。
B[i]的左半部分,定义为C[i] = C[i-1] * A[i-1]。
B[i]的有半部分,定义为D[i] = D[i+1] * A[i+1]。
因此根据这个规律求B的值。只需要遍历两边数组。先计算左半部分乘积,再计算右半部分乘积。
### 【代码实现】
/**
* @Author: makexin
* @Date: 2019/11/1920:21
*/
public class Solution {
public int[] multiply(int[] A)
{
if (A == null || A.length < 2)//不合法输入
return null;
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-2; i>=0; i--)
{
temp = temp * A[i+1];//右半部分规律
B[i] = B[i] * temp;
}
return B;
}
}
没有定义临时数组C和D。尽量避免创建太多内存空间。