238. 除自身以外数组的乘积
除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在O(n) 时间复杂度内完成此题。
示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]
思路分析:
-
求出整个数组的乘积,除以当前位置的元素。
(pass)
-
题目中明确不能使用除法。
-
数组中存在 0 ,就会导致除0错误。
-
-
将整个数组以当前元素为界限,划分为前(\(before\)) 后(\(after\))两部分,当前位置的结果就是\(before \times after\)。
public int[] productExceptSelf(int[] nums) {
int m = nums.length;
int[] res = new int[m]; // res就是除当前元素的乘积
// 初始化
for(int i = 0; i < m; i++){
res[i] = 1;
}
int before = 1; //当前元素的“前缀积”
int after = 1; //当前元素的“后缀积”
for(int i = 0; i < m ; i++){
res[i] *= before; //此时before是上一个元素的“前缀积”
before *= nums[i]; //然后再乘以当前的元素
}
for(int j = m-1; j >= 0; j--){
res[j] *= after; //此时before是后一个元素的“后缀积”
after *= nums[j]; //然后再乘以当前元素
}
return res;
}
[!NOTE]
需要注意的点:
- 初始化时,元素都为 1 ,而不是 0 ,为 0 的话,全部变成 0 了。
- 先收集的结果,在更新的当前的”前缀积“或者”后缀积“。