具体思想:
类似于双向前缀和的思路;
也可以先遍历一边,在反向遍历,来节省部分空间;
但总的来说空间还是O(n);
具体代码:
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int n=a.size();
vector<int>v1(n,1);
vector<int>v2(n,1);
for(int i=0;i<n;i++){
if(i==0){
v1[i]=a[i];
v2[n-i-1]=a[n-i-1];
continue;
}
v1[i]=v1[i-1]*a[i];
v2[n-i-1]=v2[n-i]*a[n-i-1];
}
vector<int>ret(n,1);
for(int i=0;i<n;i++){
if(i==0){
ret[i]=v2[i+1];
}else if(i==n-1){
ret[i]=v1[i-1];
}else{
ret[i]=v1[i-1]*v2[i+1];
}
}
return ret;
}
};