思路及解答暴力
对每个B[i]都计算A中除A[i]外所有元素的乘积双重循环外层遍历B的每个位置内层遍历A数组跳过当前元素javapublic class Solution { public int[] multiply(int[] A) { if (A null || A.length 1) { return new int[0]; // 根据题目要求长度1时返回空数组 } int n A.length; int[] B new int[n]; // 遍历每个B[i] for (int i 0; i n; i) { int product 1; // 初始化乘积为1 // 计算A中除A[i]外所有元素的乘积 for (int j 0; j n; j) { if (j ! i) { // 跳过当前元素A[i] product * A[j]; } } B[i] product; // 将结果存入B[i] } return B; } }时间复杂度O(n²)需要嵌套循环遍历数组空间复杂度O(1)除结果数组外只使用常数空间左右乘积数组法空间换时间使用左右两个辅助数组存储乘积信息思路left[i]表示A[0]到A[i-1]的乘积right[i]表示A[i1]到A[n-1]的乘积javapublic class Solution { public int[] multiply(int[] A) { if (A null || A.length 1) { return new int[0]; } int n A.length; int[] B new int[n]; int[] left new int[n]; // 存储左侧乘积 int[] right new int[n]; // 存储右侧乘积 // 初始化边界值 left[0] 1; // B[0]没有左侧元素乘积为1 right[n-1] 1; // B[n-1]没有右侧元素乘积为1 // 计算左侧乘积left[i] A[0] × A[1] × ... × A[i-1] for (int i 1; i n; i) { left[i] left[i-1] * A[i-1]; } // 计算右侧乘积right[i] A[i1] × A[i2] × ... × A[n-1] for (int i n-2; i 0; i--) { right[i] right[i1] * A[i1]; } // 合并左右乘积得到最终结果B[i] left[i] × right[i] for (int i 0; i n; i) { B[i] left[i] * right[i]; } return B; } }时间复杂度O(n)三次单层循环空间复杂度O(n)需要两个辅助数组矩阵视角理解 如果把问题看作矩阵B[i]就是去掉对角线元素A[i]后该行所有元素的乘积。textA [1, 2, 3, 4, 5] B[0] 2 × 3 × 4 × 5 120 (去掉A[0]) B[1] 1 × 3 × 4 × 5 60 (去掉A[1]) B[2] 1 × 2 × 4 × 5 40 (去掉A[2])左右分解策略left[i] A[0] × A[1] × ... × A[i-1] i左边的乘积right[i] A[i1] × A[i2] × ... × A[n-1] i右边的乘积B[i] left[i] × right[i]左右乘积相乘正好去掉A[i]空间优化推荐在方法二的基础上优化空间使用在结果数组B上直接进行左右乘积计算。先用B数组存储左侧乘积再用变量动态计算右侧乘积javapublic class Solution { public int[] multiply(int[] A) { if (A null || A.length 1) { return new int[0]; } int n A.length; int[] B new int[n]; // 第一步计算左侧乘积并直接存入B B[0] 1; // B[0]没有左侧元素 for (int i 1; i n; i) { // B[i] A[0] × A[1] × ... × A[i-1] B[i] B[i-1] * A[i-1]; } // 第二步从右向左遍历用temp变量累积右侧乘积 int temp 1; // 用于累积右侧乘积 for (int i n-1; i 0; i--) { // B[i]当前存储的是左侧乘积乘以右侧乘积得到最终结果 B[i] B[i] * temp; // 更新temp为下一个位置i-1准备右侧乘积 temp temp * A[i]; } return B; } }时间复杂度O(n)两次遍历数组空间复杂度O(1)除结果数组外只使用常数空间算法步骤详解第一步左侧乘积计算highlighter-初始: B[0] 1 i1: B[1] B[0] × A[0] 1 × 1 1 i2: B[2] B[1] × A[1] 1 × 2 2 i3: B[3] B[2] × A[2] 2 × 3 6 i4: B[4] B[3] × A[3] 6 × 4 24 此时B [1, 1, 2, 6, 24] (存储的是各位置的左侧乘积)第二步右侧乘积整合highlighter-初始: temp 1 i4: B[4] 24 × 1 24, temp 1 × 5 5 i3: B[3] 6 × 5 30, temp 5 × 4 20 i2: B[2] 2 × 20 40, temp 20 × 3 60 i1: B[1] 1 × 60 60, temp 60 × 2 120 i0: B[0] 1 × 120 120, temp 120 × 1 120 最终B [120, 60, 40, 30, 24]