题目描述
给定一个数组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,B[i] = A[0] * A[1] * … * A[i-1]*A[i+1] * A[N-1]
解题思路一:
- 直接for循环,每次B[i]求出每项的值即可
- 暴力求解,时间复杂度为O(N^N)
/**
* B[i] = A[0] * ... * A[N-1],除了A[i]变为1
* 时间复杂度为O(N^N)
* @param A
* @return
*/
public int[] multiply(int[] A) {
int[] B = new int[A.length];
for (int i = 0; i < B.length; i++) {
int sum = 1;
for (int j = 0; j < A.length; j++) {
if (i != j){
sum *= A[j];
}
}
B[i] = sum;
}
return B;
}
解题思路二:
- 我们以1为分隔,先求出下三角,再求出上三角
- 时间复杂度为O(N^N)
/**
* 先求出下三角,再求出上三角
* 时间复杂度为O(N)
* @param A
* @return
*/
public int[] multiply1(int[] A) {
int len = A.length;
int[] B = new int[A.length];
if (len != 0){
B[0] = 1;
//计算下三角连乘
for (int i = 0; i < len; i++) {
B[i] = B[i-1] * A[i-1];
}
int temp = 1;
//计算下三角
for (int i = len - 2; i >= 0; --i) {
temp *= A[i+1];
B[i] *= temp;
}
}
return B;
}
![](https://i-blog.csdnimg.cn/blog_migrate/088143d95c609550dfb2bee169f4c2c1.jpeg)
代码地址:
https://github.com/HanYLun/jianzhiOffer/blob/master/Solution/src/Que51.java
文章为DavidHan原创,如果文章有错的地方欢迎指正,大家互相交流。