题目:
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
题解:
乘积 = 当前数左边的乘积 * 当前数右边的乘积
原数组: [1 2 3 4]
左部分的乘积: 1 1 1*2 1*2*3
右部分的乘积: 2*3*4 3*4 4 1
结果: 1*2*3*4 1*3*4 1*2*4 1*2*3*1
需要进行两次遍历,第一次遍历用于求左部分的乘积,第二次遍历在求右部分的乘积的同时,再将最后的计算结果一起求出来。
class Solution {
public int[] productExceptSelf(int[] nums) {
int k = 1;
int[] res = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
res[i] = k; //记录res[i]时不加入nums[i]
k *= nums[i]; //为下一个res记录作准备, 此时数组存储的是除去当前元素左边的元素乘积
}
k = 1;
for (int i = nums.length - 1; i >=0; i--) {
res[i] *= k; // k为该数右边的乘积
k *= nums[i]; // 此时数组等于左边的 * 该数右边的。
}
return res;
}
}