LeetCode:238. Product of Array Except Self(除自身外的乘积)
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].
Solve it without division and in O(n).
For example, given [1,2,3,4], return [24,12,8,6].
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len=nums.size();
vector<int> pre(len),next(len);//i处前后两边乘积
pre[0]=next[len-1]=1;
for(int i=1,j=len-2;i<len&&j>=0;++i,--j)
{
pre[i]=pre[i-1]*nums[i-1];
next[j]=next[j+1]*nums[j+1];
}
vector<int> res(len);
for(int i=0;i<len;++i)
{
res[i]=pre[i]*next[i];
}
return res;
}
};
64ms,这样很简洁明了,但是维护了两个数组空间,需要降下空间复杂度,其中n>1,所以可以省略 if(nums.empty()) return vector{};。
看别人思路后的更改,60ms:
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len=nums.size();
vector<int> res(len);
res[0]=1;//先算i前面乘积
for(int i=1;i<len;++i)
{
res[i]=res[i-1]*nums[i-1];
}
//再综合i后面乘积
int mul=1;
for(int i=len-1;i>=0;--i)
{
res[i]*=mul;
mul*=nums[i];
}
return res;
}
};
其实还可以改:前面的乘积保留,后面的乘积保留,res元素初始为1,前后同时写值相乘,64ms。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len=nums.size();
vector<int> res(len,1);
int preMul=1,nextMul=1;
for(int i=0,j=len-1;i<len&&j>=0;++i,--j)
{
res[i]*=preMul;
res[j]*=nextMul;
preMul*=nums[i];
nextMul*=nums[j];
}
return res;
}
};