大致题意:有一个数组a0,a1,a2,...an,返回一个相同长度数组,这个数组的i号元素是a0*...*an/ai,不用除法完成这个任务。时间复杂度是o(n)
拓展:空间复杂度是否能用到o(1)
解法1:
类似于动态规划的解法,用一个pre数组保存前i个元素的积,用一个next数组表示后i个元素的积,这样num[i]=pre[i-1]*next[i+1]
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int i,j,k=1,s=nums.size();
vector<int> pre;
vector<int> hou;
vector<int> ans;
for(i=0;i<s;i++)
{
k=k*nums[i];
pre.push_back(k);
}
k=1;
for(i=s-1;i>=0;i--)
{
k=k*nums[i];
hou.push_back(k);
}
ans.push_back(hou[s-2]);
for(i=1;i<s-1;i++)
ans.push_back(pre[i-1]*hou[(s-1)-(i+1)]);
ans.push_back(pre[s-2]);
return ans;
}
};
解法2:
上述代码的空间复杂度是o(n),不满足题目要求。
我们可以不用pre和next两个数组
首先把前i个元素的成绩放入ans数组,然后从后往前乘,用p记录当前的乘法,然后让需要乘p的数组乘。。。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int i,j,k=1,s=nums.size(),p;
vector<int> ans;
p=1;
for(i=0;i<s;i++)
{
ans.push_back(p);
p=p*nums[i];
}
p=1;
for(i=s-1;i>=0;i--)
{
ans[i]=ans[i]*p;
p=p*nums[i];
}
return ans;
}
};