[数组]剑指 Offer 66. 构建乘积数组
题目描述:
给定一个数组 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]。不能使用除法。
示例:
输入: [1,2,3,4,5]
输出: [120,60,40,30,24]
提示:
所有元素乘积之和不会溢出 32 位整数
a.length <= 100000
解答:
解法一:多次遍历(时间复杂度o(n2)
import java.util.ArrayList; public class Solution { public int[] multiply(int[] A) { int length = A.length; int[] B = new int[length]; for(int i = 0;i<length;i++){ B[i] = 1; for(int j = 0;j<length;j++){ if(j!= i){ B[i] = B[i]*A[j]; } } } return B; } }
解法二:
时间复杂度(o(n)


我的解答:
class Solution { public int[] constructArr(int[] a) { int length = a.length; if(length == 0) return a; int b[] = new int [length]; int c[] = new int[length]; int d[] = new int[length]; c[0] = 1; d[length-1] = 1; for(int i = 1;i<length;i++){ c[i] = c[i-1]* a[i-1]; } for(int j =length-2;j>=0;j--){ d[j] = d[j+1]*a[j+1]; } for(int k = 0 ;k<length;k++){ b[k] = c[k] * d[k]; } return b; } }
优化我的解答:
上面方法中c[], d[]数组可以省去。
代码如下:
class Solution { public int[] constructArr(int[] a) { if(a.length == 0) return new int[0]; int[] b = new int[a.length]; b[0] = 1; int tmp = 1; for(int i = 1; i < a.length; i++) { b[i] = b[i - 1] * a[i - 1]; } for(int i = a.length - 2; i >= 0; i--) { tmp *= a[i + 1]; b[i] *= tmp; } return b; } }

浙公网安备 33010602011771号