1. 题意
除了自身外的乘积,题目要求不能用除法做。
2. 题解
不用除法做,那就用前后缀分解的方法做。
时间复杂度O(n)O(n)O(n)
- 两个数组记录前后缀乘积
cpp
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n);
vector<int> suf(n);
pre[0] = 1;
for (int i = 1; i < n; ++i)
pre[i] = nums[i - 1] * pre[i - 1];
suf[0] = 1;
for (int i = n - 1;i > 0; --i) {
suf[n - i] = suf[n - i - 1] * nums[i];
}
vector<int> ans(n, 1);
for (int i = 0;i < n; ++i)
ans[i] = pre[i] * suf[n - 1 - i];
return ans;
}
};
事实上这个两个数组空间都可以直接优化掉,下面的空间复杂度为O(1)O(1)O(1)
cpp
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n, 1);
int pre = 1;
for (int i = 1;i < n; ++i) {
pre *= nums[i - 1];
ans[i] *= pre;
}
int suf = 1;
for (int i = n - 2; ~i; --i) {
suf *= nums[i + 1];
ans[i] *= suf;
}
return ans;
}
};```