题目描述
// 66. 构建乘积数组
// 力扣
// 给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i]
// 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]
// ×A[i+1]×…×A[n-1]。不能使用除法。
// 牛客
// 给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-// 2];)
// 对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
题解
//////////////////////////// 暴力 ///////////////////////
// 【伪解法】
// 力扣
// 无法通过
class Solution {
public int[] constructArr(int[] a) {
int[] b = new int[a.length];
for (int i = 0; i < b.length; i++) {
int num = 1;
for (int j = 0; j < a.length; j++) {
if (j == i)
continue;
num *= a[j];
}
b[i] = num;
}
return b;
}
}
// 力扣
// 可以看着实例来理解
// 输入: [1,2,3,4,5]
// 输出: [120,60,40,30,24]
//
// 计算b[i]是除a[i]以外所有的a中元素的乘积,
// 我们可以把i看做一个分界线,在i移动的时候,把a中的元素分成了
// 左右两边,我们按照左右两半边来分别进行计算。
// 例如:实例中乘积为b[3]=30的a元素,包括1 2 3和5,左半边就是1 2 3。
// 乘积为b[2]=40的a元素,包括1 2 4和5,左半边是1 2
// 乘积为b[1]=60的a元素,包括1 3 4和5,左半边是1
// 可以发现,左半边其实在逐渐往一个方向累乘,右半边也是。
// 我们只需将两边分开累乘赋值给b,即可高效地完成运算。
//
// 第一个for循环,从左往右遍历a和b,索引记为i,遍历到len-2为止,
// a[0]对b[0]没有贡献, 我们将b[0]初始化为1,
// 将a[i]累乘到product中,将product赋给b[i+1],完成左半边的累乘。
//
// 第二个for循环,从右往左遍历a和b,遍历到1为止,a[i]累乘到product,
// b由于之前已经计算过了,所以product再累乘到b[i - 1]元素。
// 左右半边计算完,则b元素就累乘完了,直接返回b。
// 执行用时:2 ms, 在所有 Java 提交中击败了80.14%的用户
// 内存消耗:51.3 MB, 在所有 Java 提交中击败了26.55%的用户
class Solution {
public int[] constructArr(int[] a) {
if (a == null || a.length == 0)
return new int[0];
int len = a.length;
int[] b = new int[len];
int product = 1;
b[0] = product;
for (int i = 0; i <= len - 2; i++) {
product *= a[i];
b[i + 1] = product;
}
product = 1;
for (int i = len - 1; i >= 1; i--) {
product *= a[i];
b[i - 1] *= product;
}
return b;
}
}
// 牛客
// 运行时间:9ms超过99.07%用Java提交的代码
// 占用内存:9732KB超过2.41%用Java提交的代码
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
if (A == null || A.length == 0)
return new int[0];
int len = A.length;
int[] B = new int[len];
int product = 1;
B[0] = 1;
for (int i = 0; i <= len - 2; i++) {
product *= A[i];
B[i + 1] = product;
}
product = 1;
for (int i = len - 1; i >= 1; i--) {
product *= A[i];
B[i - 1] *= product;
}
return B;
}
}