题目链接:
238. 除自身以外数组的乘积 - 力扣(LeetCode)
思路分析:一个典型的以空间换时间的问题,如果开二重for循环一般情况会超时,不过考试时候写清楚思路,用二重写也比空下要好。读题以后,发现不必将所有数字的乘积除以给定索引处的数字得到相应的答案,而是利用索引左侧所有数字的乘积和右侧所有数字的乘积(即前缀与后缀)相乘得到答案。对于给定索引 i,使用它左边所有数字的乘积乘以右边所有数字的乘积。
算法分析:以空间换时间是常见的一种思想,希望大家可以掌握,感觉考的比较多。
参考代码:
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int>l(n+1,1);//分别表示左右两侧的乘积列表
vector<int>r(n+1,1);
l[0]=1;//初始化
r[n-1]=1;
//l[i]为索引i左侧所有元素的乘积,对于索引为0的,因为左侧没有元素,所以l[0]=1
for(int i=1;i<n;++i)
l[i]=l[i-1]*nums[i-1];
//r[i]为索引i右侧所有元素的乘积,对于索引为n-1的,因为右侧没有元素,所以l[n-1]=1
for(int i=n-2;i>=0;--i)
r[i]=r[i+1]*nums[i+1];
vector<int>v(n,0);
//计算结果,对每一项,都计算其左侧和右侧值的乘积
for(int i=0;i<n;++i)
v[i]=l[i]*r[i];
return v;
}
};