1、左右数组积
考虑到我们不能使用除法,我们可以对当前第 i i i行的第 i i i个元素左右的数组进行求积,而后将左右两侧的积相乘即可。时间和空间复杂度为 O ( n ) O(n) O(n)。
class Solution {
public:
vector<int> constructArr(vector<int> &a) {
int n = a.size();
vector<int> dp1(n, 1), dp2(n, 1), res(n);
for (int i = 1; i < n; ++i) {
dp1[i] = dp1[i - 1] * a[i - 1];
dp2[n - 1 - i] = dp2[n - i] * a[n - i];
}
for (int i = 0; i < n; ++i) {
res[i] = dp1[i] * dp2[i];
}
return res;
}
};
2、左右数组积优化
考虑到实际上在每次循环中我们并不会使用到数组中的每一个元素,因此我们可以对该方法的空间复杂度进行优化。我们可以使用左侧数组积来代替最终结果,使用一个变量循环来代替右侧的数组积与左侧数组积相乘即可。最终的空间复杂度为 O ( 1 ) O(1) O(1)。
class Solution {
public:
vector<int> constructArr(vector<int> &a) {
int n = a.size(), temp_product = 1;
vector<int> res(n, 1);
for (int i = 1; i < n; ++i) {
res[i] = res[i - 1] * a[i - 1];
}
for (int i = n - 1; i >= 0; --i) {
res[i] *= temp_product;
temp_product = temp_product * a[i];
}
return res;
}
};