目录
LeeCode~238.除自身以外数组的乘积
题目描述
题目分析
一开始看到这个题目,首先想到的是先将数组所有元素相乘得到总乘积,之后遍历数组,遍历到哪个元素除去哪个元素,这样就可以得到结果,但是题目要求不能使用除法。
既然不能使用除法,那两个for循环进行遍历也能得到结果,但这样的时间复杂度是O(n^2),显然不符合题目给的O(n)复杂度要求。
通过查看题解,了解到了一种左右乘积的方法,可以使时间复杂度到O(n),这个方法的核心思想就是索引,L数组表示索引为i左侧所有元素的乘积,R数组表示索引为i右侧所有元素的乘积,当R数组和L数组填充完毕后,直接再遍历一次原数组即可得到结果。
具体代码
时间复杂度为O(n)的方法
private static int[] productExceptSelf(int[] nums) {
int[] L = new int[nums.length];//i左侧的元素积
int[] R = new int[nums.length];//i右侧的元素积
int[] ret = new int[nums.length];//记录结果
L[0] = 1;//因为下标为0的元素,左侧没有数字,因此直接赋值为1
for (int i = 1; i < nums.length; i++) {
L[i] = nums[i - 1] * L[i - 1];
}
R[nums.length - 1] = 1;//因为数组最后一个元素的右侧无数字,直接赋值为1
for (int i = nums.length - 2; i >= 0; i--) {
R[i] = nums[i + 1] * R[i + 1];
}
//对于索引i,其除自身外元素的乘积就是其左侧元素乘积乘以其右侧元素乘积
for (int i = 0; i < nums.length; i++) {
ret[i] = L[i] * R[i];
}
return ret;
}
降低空间复杂度为O(1)的方法
降低空间复杂度,也就是想办法用常量来替换数组
private static int[] productExceptSelf2(int[] nums) {
int[] ret = new int[nums.length];
ret[0] = 1;
//先乘其左侧的
for (int i = 1; i < nums.length; i++) {
ret[i] = ret[i - 1] * nums[i - 1];
}
int R = 1;//R为索引所有的右侧元素的乘积
for (int i = nums.length - 1; i >= 0; i--) {
ret[i] *= R;
R *= nums[i];
}
//再乘其右侧的
return ret;
}