给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
- 有两个要求
- 1.不可以用除法
- 2.只能使用常数空间
class Solution {
public:
//1.不可以用除法
//2.使用常数空间
//该类主要是不要进行重复计算,最好用到dp思想
//本题思路是算出下标i的左侧的数的乘积和右侧的数的乘积,最后每个下标i的乘积数组就是左侧乘积*右侧乘积
//算法时间复杂度为o(n),额外空间复杂度为o(1)
vector<int> constructArr(vector<int>& a) {
if(a.empty()) return vector<int>(); //老规矩,特判一下
vector<int>res(a.size()); //最后的乘积数组
for(int i=0,p=1;i<a.size();i++) //这个循环从左到右,先更新res数组,然后才更新p,
{
res[i]=p; //p就是该下标i左侧所有数的乘积,先更新res数组,此时res[i]就是下标左侧所有数的乘积
p*=a[i]; //后更新p,维护p为下标i左侧所有数的乘积
}
for(int i=a.size()-1,p=1;i>=0;i--) //这个循环从右往左
{
res[i]*=p; //先让此时的res[i]乘于i右侧所有的数的乘积p
p*=a[i]; //更新p,使p永远为i右侧所有数的乘积
}
return res;
}
};
为了理解方便,可以先构建两个数组,一个表示下标i左边所有数乘积,一个表示下标i右边所有数乘积