题目描述
给定一个数组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]。不能使用除法。
思路:嵌套循环这里就不考虑了,因为时间复杂度n^2,这里有另一种复杂度为n的方法。
把第i个数看成是左右两半的成绩,这里偷了张图,方便大家理解(哈哈,自己懒得画了)
根据图我们来写代码就行了
1、左边B[i] = tem[i-1]*A[i-1],其中tem为上一个数字的所得乘机
2、右边B[i] = tem[i+1]*A[i+1],其中tem与1中类似,为上一个数字的所得乘机
代码具体执行:我们首先从0遍历到n-1,来计算每一位的左半边乘机->在从n-1遍历到0并且乘上左半边就得到了我们想要的结果
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
if(A==null||A.length<=0)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 tem = 1;
for(int i = A.length-2;i>=0;i--){
B[i] *= (tem *= A[i+1]);
}
return B;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
练习地址:https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46