一、题目描述
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
二、算法思路
我们可以使用前缀和与后缀和相乘。rnums这个数组表示前缀,lnums这个数组表示后缀
answer[i] = nums[0] * nums[1] *.. * nums[i-1] * nums[i+1]*...*nums[n-1]
可以拆解成2部分一部分是前缀,一部分是后缀,最后相乘就是答案
rnums[i]=nums[0] * nums[1] *.. * nums[i-1]
lnums[i]=nums[i+1]*...*nums[n-1]
他们相乘就是answer的数组
三、算法代码
class Solution {
public int[] productExceptSelf(int[] nums) {
//用前缀和于后缀和相乘
int n = nums.length;
int[] rnums = new int[n];
int[] lnums = new int[n];
int[] answer = new int[n];
//初始化
rnums[0] = 1;
lnums[n-1]=1;
//处理前缀和
for (int i = 1; i < n; i++) {
rnums[i] = rnums[i-1] * nums[i-1];
}
//处理后缀和
for (int i = n-2;i >= 0;i--){
lnums[i] = lnums[i+1] * nums[i+1];
}
//结果
for (int i = 0; i < n; i++) {
answer[i] = rnums[i] * lnums[i];
}
return answer;
}
}