方法一:左右乘积列表
class Solution {
public int[] productExceptSelf(int[] nums) {
int n=nums.length;
int[] result=new int[n];
if(n==0){
return result;
}
int[] qian=new int[n];
int[] hou=new int[n];
qian[0]=nums[0];
hou[n-1]=nums[n-1];
for(int i=1;i<n;i++){
qian[i]=qian[i-1]*nums[i];
}
for(int i=n-2;i>0;i--){
hou[i]=hou[i+1]*nums[i];
}
result[0]=hou[1];
result[n-1]=qian[n-2];
for(int i=1;i<n-1;++i){
result[i]=qian[i-1]*hou[i+1];
}
return result;
}
}
方法二:空间复杂度 O(1)O(1) 的方法
由于输出数组不算在空间复杂度内,那么我们可以将 L 或 R 数组用输出数组来计算。先把输出数组当作 L 数组来计算,然后再动态构造 R 数组得到结果
class Solution {
public int[] productExceptSelf(int[] nums) {
int length = nums.length;
int[] answer = new int[length];
// answer[i] 表示索引 i 左侧所有元素的乘积
// 因为索引为 '0' 的元素左侧没有元素, 所以 answer[0] = 1
answer[0] = 1;
for (int i = 1; i < length; i++) {
answer[i] = nums[i - 1] * answer[i - 1];
}
// R 为右侧所有元素的乘积
// 刚开始右边没有元素,所以 R = 1
int R = 1;
for (int i = length - 1; i >= 0; i--) {
// 对于索引 i,左边的乘积为 answer[i],右边的乘积为 R
answer[i] = answer[i] * R;
// R 需要包含右边所有的乘积,所以计算下一个结果时需要将当前值乘到 R 上
R *= nums[i];
}
return answer;
}
}