给你一个整数数组 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] nums ,对于每个元素,其结果都可以看成是其左边的元素乘积和右边元素乘积的乘积,所以可以先算出每个元素左边的乘积和右边的乘积。对于左边元素的乘积,记为数组 L ,第 i 个元素表示前 i 个元素的乘积,使用动态规划,第一个元素是 1 ,因为左边为空,接下来,第 i 个元素是 num[i-1] 乘 L[i-1] ;右边元素的乘积(记为 R )类似,只不过是最后一个元素为 1 ,然后从后往前推;最后每一个元素的结果就是 L[i] * R[i] 。时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( n ) \Omicron(n) O(n)
class Solution { public: vector productExceptSelf(vector& nums) { int n=nums.size(); vector L(n),R(n); L[0]=1; R[n-1]=1; for(int i=1;i L[i]=L[i-1]*nums[i-1]; R[n-i-1]=R[n-i]*nums[n-i]; } for(int i=0;i nums[i]=L[i]*R[i]; } return nums; } }; 时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( 1 ) \Omicron(1) O(1)
class Solution { public: vector productExceptSelf(vector& nums) { int n=nums.size(); int zero=0,mul=1; for(int i=0;i if(nums[i]==0){ zero++; } else{ mul*=nums[i]; } } if(zero>=2){ // 0 元素个数大于等于 2 个,总积为 0 mul=0; } for(int i=0;i if(nums[i]!=0) // (zero-1)*(zero-1) 为了处理 0 元素个数为 1 和 0 的情况。 nums[i]=mul/nums[i]*(zero-1)*(zero-1); else nums[i]=mul; } return nums; } };