题目
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
示例 1:
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
思路1:
使用L记录i左侧数的乘积,L[0]=0,R记录右侧的乘积,ret[i]=L[i]*R[i]
时间和空间复杂度都为O(n)
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); vector<int> L(n); vector<int> R(n); L[0]=1; for(int i=1;i<n;++i) L[i]=L[i-1]*nums[i-1]; R[n-1]=1; for(int i=n-2;i>=0;--i) R[i]=R[i+1]*nums[i+1]; vector<int> answer(n); for(int i=0;i<n;++i) answer[i]=L[i]*R[i]; return answer; } };
思路2:
使用answer用作记录L,然后用一个参数R记录R,先走一遍L流程,
然后走R流程时直接用answer*R,同时R*=nums[i]
这样空间复杂度O(1)
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n=nums.size(); vector<int> answer(n); answer[0]=1; for(int i=1;i<n;++i) answer[i]=answer[i-1]*nums[i-1]; int R=1; for(int i=n-1;i>=0;--i){ answer[i]=answer[i]*R; R*=nums[i]; } return answer; } };