238.除自身以外数组的乘积
思路:
利用索引左侧所有数字的乘积和右侧所有数字的乘积(即前缀和后缀)相乘得到答案
算法:
1.初始化两个空数组L和R,对于给定索引i,L[i]代表的是i左侧所有数字的乘积,R[i]代表的是i右侧所有数字的乘积
2.需要用两个循环来填充L和R数组的值,对于数组L,L[0]应该是1,因为第一个元素的左边没有元素,对于其他元素: L [ i ] = L [ i − 1 ] ∗ n u m s [ i − 1 ] L[i] = L[i-1] * nums[i-1] L[i]=L[i−1]∗nums[i−1],同样,对于R,R[length-1]=1,其他元素: R [ i ] = R [ i + 1 ] ∗ n u m s [ i + 1 ] R[i] = R[i+1] * nums[i+1] R[i]=R[i+1]∗nums[i+1]
3.当R和L数组填充完成,只需要在输入数组上迭代,索引i处的值为 L [ i ] ∗ R [ i ] L[i]*R[i] L[i]∗R[i]
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
//L和R分别表示左右两侧的乘积列表
int[] L = new int[n];
int[] R = new int[n];
int[] ans = new int[n];
//L[i]为索引i左侧所有元素的乘积
//对于索引为0的元素,左侧没有元素,所以L[0]=1
L[0] = 1;
for(int i =1;i<n;i++){
L[i] = nums[i - 1] * L[i-1];
}
//R[i]为索引i右侧所有元素的乘积
R[n - 1] = 1;
for(int i = n-2;i>=0;i--){
R[i] = nums[i + 1] * R[i + 1];
}
for(int i = 0;i<n;i++){
ans[i] = L[i] * R[i];
}
return ans;
}
}