238. 除自身以外数组的乘积
方法一
方法一:计算数组nums每个元数除自身之外的乘积可以使用该元数的前缀之积与后缀之积。使用两个数组保存前缀之积与后缀之积。从前向右填充L,从右向左填充R。最后前缀之积与后缀之积对应相乘就得到了答案。
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] ans = new int[nums.length];
int[] L = new int[nums.length];//前缀之积
int[] R = new int[nums.length];//后缀之积
for(int i = 0; i < nums.length; i++){
if(i==0){
L[i] = 1;//我在循环内用判断来初始化L[0],也可以在循环外初始化L[0],然后循环从i=1开始;
R[nums.length-1] = 1;
}else{
L[i] = L[i-1] * nums[i-1];
R[nums.length-1-i] = R[nums.length-i] * nums[nums.length-i];
}
}
for(int i = 0; i < nums.length; i++){
ans[i]=L[i]*R[i];
}
return ans;
}
}
方法二
方法二进一步优化了空间复杂度,可以使用ans数组先保存前缀之积,再重复使用一个变量R保存后缀之积,然后R与ans对应相乘就得到了答案。
class Solution {
public int[] productExceptSelf(int[] nums) {
int[] ans = new int[nums.length];
for(int i = 0; i < nums.length; i++){
if(i==0){
ans[i] = 1;
// R[nums.length-1] = 1;
}else{
ans[i] = ans[i-1] * nums[i-1];
// R[nums.length-1-i] = R[nums.length-i] * nums[nums.length-i];
}
}
int R = 1;
for(int i = 0; i < nums.length; i++){
if(i==0){
ans[nums.length-1]*=R;
}else{
R *= nums[nums.length-i];
ans[nums.length-1-i]*=R;
}
}
return ans;
}
}
参考
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/product-of-array-except-self