16.除自身以外数组的乘积
给你一个整数数组 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]
提示:
- 2 <= nums.length <= 105
- -30 <= nums[i] <= 30
- 输入 保证 数组 answer[i] 在 32 位 整数范围内
代码:
class Solution {
public int[] productExceptSelf(int[] nums) {
//数组长度
int len = nums.length;
//左前缀积数组,left[i]表示nums前i个元素的积
int[] left = new int[len];
//右前缀积数组,right[i]表示nums[i]到nums[len-1]的元素的积
int[] right = new int[len];
//结果数组
int[] res = new int[len];
//初始化left[0]、right[len-1]
left[0] = nums[0];
right[len-1] = nums[len-1];
//left[i] = left[i-1]*nums[i]
for(int i=1;i<len;i++)left[i] = left[i-1]*nums[i];
//right[i] = right[i+1]*nums[i]
for(int i=len-2;i>=0;i--)right[i] = right[i+1]*nums[i];
//计算结果
for(int i=0;i<len;i++){
if(i==0)res[i] = right[i+1];
else if(i==len-1)res[i] = left[i-1];
else res[i] = left[i-1]*right[i+1];
}
return res;
}
}